三、题目:神奇的算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成.
比如:2106=1260,
8473=3784,
27*81=2187都符合要求
如果满足乘法交换律的算式算作同一种情况,那么,一共有多少种满足?
分析思路:
遇到这种数字整数计算可以想到用枚举法计算
这道题目用枚举法,需要注意到首位数字不能为0,这道题目输出结果的时候。
要注意可能会出现重复的数字,就需要在前面把具体的数字计算输出检查是否有重复的算式。还需要看算式的数字排列顺序,利用数字转化为字符串,排序后比较算式中的过程中的数字与计算结果是否一致。
代码:
#include<iostream>
#include<sstream>
#include<string>
#include<algorithm>
using namespace std;
bool check(int src,int r){
//先转字符串,排序,比较
string src_str,r_str;
stringstream ss;
ss<<src; //将int类型的值放入输入流
ss>>src_str; //从ss中抽取出前面插入的int类型的值,赋给string
stringstream ss1;
ss1<<r;
ss1>>r_str;
sort(r_str.begin(),r_str.end()); //已转的字符串,排序
sort(src_str.begin(),src_str.end());
if(r_str==src_str){ //排序后进行比较
return true;
}
return false;
}
int ans;
int main(){
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
if(i!=j)
for(int k=0;k<10;k++){
if(k!=j&&k!=i)
for(int m=0;m<10;m++){
if(m!=k&&m!=j&&m!=i){
int src=i*1000+j*100+k*10+m; //ijkm四位数
//验证
if(j!=0){
int r1=i*(j*100+k*10+m); //乘法1位乘以3位结果
if(check(src,r1)){
printf("%d* %d\n",i);
ans++;
}
}
//验证
if(k!=0){
int r2=(i*10+j)*(k*10+m); //乘法2位乘以2位结果
if(check(src,r2)){
printf("%d* %d\n",i*10+j,k*10+m);
ans++;
}
}
if(m!=0){
int r3=(i*100+j*10+k)*(k); //乘法以3位乘以1位结果
if(check(src,r3)){
printf("%d * %d\n",i*100+j*10+k,m);
ans++;
}
}
}
}
}
}
}
cout<<ans<<" "<<endl;
return 0;
}
运行出来的结果有5个不符合的,有重复的
答案:12