这个题就是穷举,相对简单,枚举出所有的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 }
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 }