crypt1解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------【题目】 用给出的N个数字,替换以下竖式,能生成多少个正确的竖式? * * * x * * ------- * * * * * * ------- * * * * 输入文件,第一行N表示有N个数字,第二行给出所有数字(空格分割。)【数据范围】 所有数字∈{1,2,3,4,5,6,7,8,9}【输入样例】 5 2 3 4 6 8【输出样例】 1------------------------------------------------------------------------------------------------------------------------------------------------【分析】 竖式中,只要知道乘数和被乘数,就可以计算出下面三个结果。 因此,只要枚举这两个数就好,一共5位,9^5<100000,一定没问题。------------------------------------------------------------------------------------------------------------------------------------------------【总结】 一遍AC。 样例一开始本机测试没过,原因是乘出来的三个结果没判断位数是否正确。可以说,还是读题不够严谨仔细。------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
1 /* 2 ID: icedrea1 3 PROB: crypt1 4 LANG: C++ 5 */ 6 7 #include8 #include 9 using namespace std;10 11 int N,D[10];12 bool have[10];13 14 bool ok(int num)15 {16 while(num)17 {18 if(!have[num%10]) return false;19 num/=10;20 }21 return true;22 }23 bool ok(int A,int B,int C,int D,int E)24 {25 int i = A*100+B*10+C;26 int j = D*10+E;27 int x = i*E; if(x<100 || x>999) return false;28 int y = i*D; if(y<100 || y>999) return false;29 int z = x+y*10; if(z<1000 || z>9999) return false;30 return ok(x) && ok(y) && ok(z);31 }32 33 int main()34 {35 ifstream in("crypt1.in");36 ofstream out("crypt1.out");37 38 in>>N;39 for(int i=1;i<=N;++i) { in>>D[i]; have[D[i]]=true; }40 41 int s=0;42 for(int a=1;a<=N;++a)43 for(int b=1;b<=N;++b)44 for(int c=1;c<=N;++c)45 for(int d=1;d<=N;++d)46 for(int e=1;e<=N;++e)47 if(ok(D[a],D[b],D[c],D[d],D[e])) ++s;48 out< <