一、引入:
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab*cde =adb*ce 这样的算式一共有多少种呢?
二、分析:
找出满足 ab*cde = adb*ce 且 a b c d e 代表1~9各不相同的5个数字 的算式组合数 。
三、代码:
1.dfs搜索法:
vis[10] :标记数组;
a[5] :存放 a,b,c,d,e 5个数;
回溯法。
#include<iostream>
using namespace std;
int a[5]={0};
int vis[10]={0};
int index = 0;
void dfs(int k){
if(k==5){
if( (a[0]*10+a[1])*(a[2]*100+a[3]*10+a[4]) == (a[0]*100+a[3]*10+a[1])*(a[2]*10+a[4]) ){
index++;
}
return;
}
for(int i=1;i<=9;i++){
if(!vis[i]){
vis[i]=1;
a[k]=i;
dfs(k+1);
vis[i]=0;
}
}
}
int main(){
dfs(0);
cout<<index<<endl;
return 0;
}
// ans:142
2.暴力破解法:
#include<iostream>
using namespace std;
int main(){
int a,b,c,d,e;
int index=0;
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
for(int k=1;k<=9;k++){
for(int l=1;l<=9;l++){
for(int m=1;m<=9;m++){
int a[11]={0};//初始化
//去掉重复的组合
a[i]++;a[j]++;a[k]++;a[l]++;a[m]++;
bool isok=true;
for(int x=0;x<=10;x++){
if(a[x]>1) {
isok=false;
break;
}
}
if(!isok) continue;
if( (i*10+j)*(k*100+l*10+m) == (i*100+l*10+j)*(10*k+m) ){
cout<<(i*10+j)<<"*"<<(k*100+l*10+m)<<
"="<<(i*100+l*10+j)<<"*"<<(10*k+m)<<endl;
index++;
}
}
}
}
}
}
cout<<index<<endl;
return 0;
}
// ans:142