标题:神奇算式 (枚举+检查+字符串比较)
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。 比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。 如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。 请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
代码:
#include <iostream> using namespace std; #include <sstream> #include <algorithm> //算法头文件 本题用于sort int ans = 0; bool check(int rand,int sum) //将两个int型转化为string型,然后排序进行比对 { string ss_rand,ss_sum; stringstream ss; //cout<<rand<<" "<<sum<<endl; ss<<rand; ss>>ss_rand; //转rand stringstream ss1; ss1<<sum; ss1>>ss_sum; //转sum sort(ss_rand.begin(),ss_rand.end()); sort(ss_sum.begin(),ss_sum.end()); //cout<<ss_rand<<" "<<ss_sum<<endl; if(ss_rand == ss_sum){ cout<<rand<<" "<<sum<<endl; ans++; //相同加1 return true; } else return false; } int main() { int r1,r2,r3; for(int i=1;i<10;i++){ for(int j=0;j<9;j++){ if(i!=j) for(int k=0;k<10;k++) if(i!=k&&j!=k) for(int p=0;p<10;p++) if(i!=p&&j!=p&&k!=p){ //不与之前相同的条件 int sum = i*1000+j*100+k*10+p; //一种求和 if(p!=0){ r1 = (i*100+j*10+k)*p; if(check(r1,sum)) cout<<"r1:"<<i*100+j*10+k<<"*"<<p<<"="<<sum<<endl<<endl; } if(j!=0){ r2 = i*(j*100+k*10+p); if(check(r2,sum)) cout<<"r2:"<<i<<"*"<<j*100+k*10+p<<"="<<sum<<endl<<endl; } if(k!=0){ r3 = (i*10+j)*(k*10+p); //只有二位*二位才会有乘法交换律,应当保持前面小于后面也是一个条件 if(check(r3,sum)&&((i*10+j)<(k*10+p))) cout<<"r3:"<<i*10+j<<"*"<<k*10+p<<"="<<sum<<endl<<endl; } } } } cout<<ans<<endl; return 0; }
/*
注意点:
1.四个数互不相同
2.同时三条式子中,两个乘数中不能有一个乘数为0
3.注意乘法交换律对于二位数乘二位数要加一个条件
*/