蓝桥杯决赛之猜算式1

来源:互联网 发布:清镇市各乡镇人口数据 编辑:程序博客网 时间:2024/05/18 02:31


看下面的算式:


□□ x □□ = □□ x □□□


它表示:两个两位数相乘等于一个两位数乘以一个三位数。


如果没有限定条件,这样的例子很多。


但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!


比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....


请编程,输出所有可能的情况!


注意:左边的两个乘数交换算同一方案,不要重复输出!



要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。 
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;
不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。

#include<iostream>#include<set>using namespace std;set<int> haha;int check(int n)//如果第二个积数出现过就不必再找了 {set<int>::iterator it;it=haha.find(n);if(it==haha.end())return 1;elsereturn 0;}int main(){for(int a=1;a<=9;a++)for(int b=1;b<=9;b++)for(int c=1;c<=9;c++)for(int d=1;d<=9;d++)for(int e=1;e<=9;e++)for(int f=1;f<=9;f++){int i,j,k;if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&b!=c&&b!=d&&b!=e&&b!=f&&c!=d&&c!=e&&c!=f&&d!=e&&d!=f&&e!=f)   {   double p=(double)(a*10+b)*(c*10+d)/(e*10+f);//这样可以节省三层循环,但是获得数字不一定是三位数或者是整数,所以我们要判断一下是不是小数    haha.insert(a*10+b);//把第一个成数插入到set容器中去    if(check(c*10+d)&&p==(int)p)   {   i=(int)p%10;   j=(int)p/10%10;k=(int)p/100; //取出每一位 if(k!=0&&j!=0&&i!=0&&i!=a&&i!=b&&i!=c&&i!=d&&i!=e&&i!=f&&j!=a&&j!=b&&j!=c&&j!=d&&j!=e&&j!=f&&k!=a&&k!=b&&k!=c&&k!=d&&k!=e&&k!=f&&k!=i&&k!=j&&i!=j)//判断是不是每一位都满足题意 cout<<a*10+b<<" x "<<c*10+d<<" = "<<e*10+f<<" x "<<k*100+j*10+i<<endl;   }}} } 








0 0
原创粉丝点击