大大大菜鸟

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
这个题就是穷举,相对简单,枚举出所有的5位数,然后判断积是否符合题目的规范。

代码如下:

 1 #include <iostream>
 2 #include <fstream>
 3 #include <string>
 4 #include <vector>
 5 #include <stdlib.h>
 6 #include <string.h>
 7 #include <sstream>
 8 
 9 using namespace std;
10 
11 int N;
12 
13 int digits[10];
14 
15 int nums[6];
16 int res=0;
17 
18 char dicHas[10];
19 
20 //判断数字是否在给定的集合中
21 bool isInNums(int n,int cnt){
22     int limit = cnt==3?999:9999;
23 
24     if(n>limit)
25         return false;
26 
27     stringstream ss;
28 
29     string str;
30     ss<<n;
31     ss>>str;
32     for(int i=0;i<cnt;i++){
33         if(!dicHas[ str[i]-'0'])
34             return false;
35     }
36 
37     return true;
38 }
39 
40 
41 bool isSolution(int nums[5]){
42     int mul=nums[0]*100+nums[1]*10+nums[2];
43     int bemul=nums[3]*10+nums[4];
44 
45     int fisrtPartialProduct=mul*nums[4];
46     int secondPartialProduct=mul*nums[3];
47     int res=secondPartialProduct*10+fisrtPartialProduct;
48 
49     if(    isInNums(fisrtPartialProduct,3&& 
50         isInNums(secondPartialProduct,3&& 
51         isInNums(res,4)){
52             return true;
53     }else
54         return false;
55     
56 
57 }
58 
59 void prime(int idx){
60 
61     int candidate[10];
62     memcpy(candidate,digits,sizeof(int)*N);
63     for(int i=0;i<N;i++){
64         nums[idx]=candidate[i];
65             
66         if(idx==4){
67             if(isSolution(nums)){
68                 res++;
69             }
70         }else
71             prime(idx+1);
72     }
73 
74 }
75 
76 
77 int main() {
78     ofstream fout ("crypt1.out");
79     ifstream fin ("crypt1.in");
80 
81 
82     memset(dicHas,0,10);
83 
84     fin>>N;
85     for(int i=0;i<N;i++){
86         fin>>digits[i];
87         dicHas[digits[i]]=1;
88     }
89 
90     prime(0);
91 
92     fout<<res<<endl;
93     
94 }


 

posted on 2010-06-12 19:13  月蚀之罪  阅读(653)  评论(0编辑  收藏  举报