引用:
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
───────
X Y Z D E
复制内容到剪贴板
代码:
//abcdefgxyz
/*输出格式
a b c d e
d f g
+ d f g
-----------
x y z d e
*/
#include<iostream>
using namespace std;
struct __chars{
int a,b,c,d,e,f,g,x,y,z;
};
union __tc{
__chars cs;
int cas[10];
};
__tc tc;
int num1,num2,num3;
bool check(){
//分别求出 各个字符代表的数字
tc.cs.a=num1/10000;
tc.cs.b=(num1/1000)%10;
tc.cs.c=(num1/100)%10;
tc.cs.d=(num1/10)%10;
tc.cs.e=num1%10;
tc.cs.f=(num2/10)%10;
tc.cs.g=num2%10;
tc.cs.x=num3/10000;
tc.cs.y=(num3/1000)%10;
tc.cs.z=(num3/100)%10;
//下面是一系列判断准则,每次判断以后就检查是否正确,否则返回
bool rt=true;
//检查10个字母代表的数字有没有重复的
for(int i=0;i<10;i++)for(int j=0;j<i;j++)if(tc.cas[i]==tc.cas[j])return false;
//先是num1,num2,num3中重复的字符
rt=rt&&(num2/100==tc.cs.d);
if(!rt)return false;
rt=rt&&(num3/10)%10==tc.cs.d;
rt=rt&&num3%10==tc.cs.e;
int up=0;//进位数
//下面是计算验证
rt=rt&&((tc.cs.e+tc.cs.g*2)%10==tc.cs.e);up=(tc.cs.e+tc.cs.g*2)/10;
if(!rt)return false;
rt=rt&&((tc.cs.d+tc.cs.f*2+up)%10==tc.cs.d);up=(tc.cs.d+tc.cs.f*2+up)/10;
if(!rt)return false;
rt=rt&&((tc.cs.c+tc.cs.d*2+up)%10==tc.cs.z);up=(tc.cs.c+tc.cs.d*2+up)/10;
if(!rt)return false;
rt=rt&&((tc.cs.b+up)%10==tc.cs.d);up=(tc.cs.b+up)/10;
if(!rt)return false;
rt=rt&&(tc.cs.a+up==tc.cs.x);
return rt;
}
void main(){
char crs[]="abcdefgxyz";
for(num1=1234;num1<=98765;num1++)for(num2=12;num2<=987;num2++)for(num3=1234;num3<=98765;num3++)if(check()){
for(int i=0;i<10;i++)cout<<crs[i]<<'='<<tc.cas[i]<<endl;
cout<<tc.cs.a<<' '<<tc.cs.b<<' '<<tc.cs.c<<' '<<tc.cs.d<<' '<<tc.cs.e<<endl;
cout<<" "<<tc.cs.d<<' '<<tc.cs.f<<' '<<tc.cs.g<<endl;
cout<<"+ "<<tc.cs.d<<' '<<tc.cs.f<<' '<<tc.cs.g<<endl;
cout<<"-----------"<<endl;
cout<<tc.cs.x<<' '<<tc.cs.y<<' '<<tc.cs.z<<' '<<tc.cs.d<<' '<<tc.cs.e<<endl;
}
}评价:感觉好差劲,运行半天没出来结果,所以结果也没法验证了

!!哪位高手帮忙提高下效率!
