大家看看怎么改进这个程序
/*1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
--------------
X Y Z D E
*/
#include <iomanip.h>
void print(int t1,int t2,int t3)
{
//输出竖式
setiosflags(-1);
cout < <setw(6) < <t1 < <endl;
cout < <setw(6) < <t2 < <endl;
cout < < '+ ' < <setw(5) < <t2 < <endl;
cout < < "------- " < <endl;
cout < <setw(6) < <t3 < <endl;
}
void main()
{
int a,b,c,d,e,f,g,x,y,z;//分别对应题中要求的字母
int t1,t2,t3;//存放相加的两个数及结果
for(a=1;a <10;a++)
for(b=0;b <10;b++)
if(b!=a)
for(c=0;c <10;c++)
if(c!=a&&c!=b)
for(d=0;d <10;d++)
if(d!=a&&d!=b&&d!=c)
for(e=0;e <10;e++)
if(e!=a&&e!=b&&e!=c&&e!=d)
for(f=0;f <10;f++)
if(f!=a&&f!=b&&f!=c&&f!=d&&f!=e)
for(g=0;g <10;g++)
if(g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f)
for(x=1;x <10;x++)
if(x!=a&&x!=b&&x!=c&&x!=d&&x!=e&&x!=f&&x!=g)
for(y=1;y <10;y++)
if(y!=a&&y!=b&&y!=c&&y!=d&&y!=e&&y!=f&&y!=g&&y!=x)
for(z=1;z <10;z++)
if(z!=a&&z!=b&&z!=c&&z!=d&&z!=e&&z!=f&&z!=g&&z!=x&&z!=y)
{
t1=10000*a+1000*b+100*c+10*d+e;
t2=100*d+10*f+g;
t3=10000*x+1000*y+100*z+10*d+e;
if(t1+2*t2==t3)
print(t1,t2,t3);
}
}
/*
答案是
29786
850
+ 850
--------
31486
*/
-----------------------------------
虽然可以得出结果,但总觉得代码很繁,应该可以改进的。
希望大家批评,建议。
[解决办法]
#include "stdio.h "
void main()
{
unsigned int a, c, d, e, x, y, z;
printf( "%10s\n ", "A B C D E ");
printf( "%10s\n ", "D F G ");
printf( "+%9s\n ", "D F G ");
printf( "%10s\n ", "─────── ");
printf( "%10s\n\n\n ", "X Y Z D E ");
for(a = 1; a < 9; a++)
{
if(a == 5)
continue;
for(c = 5; c < 9; c++)
{
if(c == a )
continue;
for(d = 5; d < 9; d++)
{
if(d == a || d == c)
continue;
x = a +1;
y = ((c +2*d +1)/10 + 9)%10;
z = (c +2*d +1)%10;
e = 31-a-c-d-x-y-z;
if(x != a && y != a && z != a && e != a
&& x != 9 && y != 9 && z != 9 && e != 9
&& x != c && y != c && z != c && e != c
&& x != d && y != d && z != d && e != d
&& x != 5 && y != 5 && z != 5 && e != 5
&& x != 0 && y != 0 && z != 0 && e != 0
&& x != y && x != z && x != e && y != z
&& y != e && z != e
&& 10000*a +9000 +100*c +10*d +e +2*(100*d +50)
== 10000*x +1000*y +100*z +10*d +e)
{
printf( "%2d%2d%2d%2d%2d\n ", a, 9, c, d, e);
printf( "%*d%2d%2d\n ", 6, d, 5, 0);
printf( "+%*d%2d%2d\n ", 5, d, 5, 0);
printf( "%10s------------\n ", "------------ ");
printf( "%2d%2d%2d%2d%2d\n ", x, y, z, d, e);
}
}
}
}
}
[解决办法]
给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
———————
X Y Z D E
#include <stdio.h>
int num[13];
long i,j;
void seperate(int* nums, long abcde, long dfg, long xyzde);
int check(void);
int main()
{
for(i=10234;i <=98765;i++)
{for(j=102;j <=987;j++)
{seperate(num,i,j,i+j*2);
if(check()) goto ok;
}}
ok:
printf( " %d%d%d%d%d\n ",num[0],num[1],num[2],num[3],num[4]);
printf( " %d%d%d\n ",num[5],num[6],num[7]);
printf( " + %d%d%d\n ",num[5],num[6],num[7]);
printf( "----------\n ");
printf( " %d%d%d%d%d\n ",num[8],num[9],num[10],num[11],num[12]);
}
void seperate(int* nums, long abcde, long dfg, long xyzde)
{
long n,p;
n=abcde;
nums[4]=n%10;
n=n/10;
nums[3]=n%10;
n=n/10;
nums[2]=n%10;
n=n/10;
nums[1]=n%10;
n=n/10;
nums[0]=n%10;
n=dfg;
nums[7]=n%10;
n=n/10;
nums[6]=n%10;
n=n/10;
nums[5]=n%10;
n=xyzde;
nums[12]=n%10;
n=n/10;
nums[11]=n%10;
n=n/10;
nums[10]=n%10;
n=n/10;
nums[9]=n%10;
n=n/10;
nums[8]=n%10;
}
int check()
{
int temp[10],m,n;
if(num[0]==num[8]) return 0;
if(num[1]==num[9]) return 0;
if(num[2]==num[10]) return 0;
if(num[3]!=num[11]||num[3]!=num[5]) return 0;
if(num[4]!=num[12]) return 0;
temp[0]=num[0];
temp[1]=num[1];
temp[2]=num[2];
temp[3]=num[3];
temp[4]=num[4];
temp[5]=num[6];
temp[6]=num[7];
temp[7]=num[8];
temp[8]=num[9];
temp[9]=num[10];
for(m=0;m <10;m++)
{
for(n=m+1;n <10;n++)
if(temp[m]==temp[n]) return 0;
}
return 1;
}
执行结果:
29786
850
+ 850
----------
31486
------解决方案--------------------
/*
请保留以下信息
作者:shaoshaoh
网址:http://blog.csdn.net/shaoshaoh
1. 给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
───────
X Y Z D E
*/
#include "stdio.h "
int num[13]; /*分别代表A,B,C,D,E,D,F,G,X,Y,Z,D,E*/
long i,j;
long result;
void seperate(int* nums, long abcde, long dfg, long xyzde);
int check(void);
int main(void){
for (i=0;i <10;i++) num[i]=0;
for (i=10234; i <98561; i++)
for(j=102; j <987; j++)
{
seperate(num,i,j,i+j*2);
if ( check() ) goto out;
}
out:
printf( "The ABCDE is:%d%d%d%d%d ",num[0],num[1],num[2],num[3],num[4]);
printf( "The DFG is:%d%d%d ",num[5],num[6],num[7]);
printf( "The XYZDE is:%d%d%d%d%d ",num[8],num[9],num[10],num[11],num[12]);
}
void seperate(int* nums, long abcde, long dfg, long xyzde)
{
nums[4]=abcde % 10;
nums[3]=(abcde - nums[4]) % 100 / 10;
nums[2]=(abcde - abcde %100)% 1000 / 100;
nums[1]=(abcde - abcde % 1000)% 10000/ 1000;
nums[0]=(abcde - abcde % 10000) / 10000;
nums[7]=dfg % 10;
nums[6]=(dfg - nums[7])%100 /10;
nums[5]=(dfg-dfg%100)/100;
nums[12]=xyzde % 10;
nums[11]=(xyzde - nums[4]) % 100 / 10;
nums[10]=(xyzde - xyzde %100)% 1000 / 100;
nums[9]=(xyzde - xyzde % 1000)% 10000/ 1000;
nums[8]=(xyzde - xyzde % 10000) / 10000;
}
int check(void)
{
int i,j,temp[10];
if (num[0] == num[8]) return 0;
if (num[1] == num[9]) return 0;
if (num[2] == num[10]) return 0;
if (num[3] != num[11] || num[3] != num[5]) return 0;
if (num[4] != num[12]) return 0;
temp[0]=num[0];
temp[1]=num[1];
temp[2]=num[2];
temp[3]=num[3];
temp[4]=num[4];
temp[5]=num[6];
temp[6]=num[7];
temp[7]=num[8];
temp[8]=num[9];
temp[9]=num[10];
for (i =0; i <10; i++)
for(j=i+1; j <10; j++)
if (temp[i] == temp[j]) return 0;
return 1;
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1219891
[解决办法]
for(c=0;c <10;c++)
if(c!=a&&c!=b)
for(d=0;d <10;d++)
if(d!=a&&d!=b&&d!=c)
for(e=0;e <10;e++)
if(e!=a&&e!=b&&e!=c&&e!=d)
for(f=0;f <10;f++)
if(f!=a&&f!=b&&f!=c&&f!=d&&f!=e)
for(g=0;g <10;g++)
if(g!=a&&g!=b&&g!=c&&g!=d&&g!=e&&g!=f)
for(x=1;x <10;x++)
if(x!=a&&x!=b&&x!=c&&x!=d&&x!=e&&x!=f&&x!=g)
for(y=1;y <10;y++)
if(y!=a&&y!=b&&y!=c&&y!=d&&y!=e&&y!=f&&y!=g&&y!=x)
for(z=1;z <10;z++)
if(z!=a&&z!=b&&z!=c&&z!=d&&z!=e&&z!=f&&z!=g&&z!=x&&z!=y)
在这个部分,
有些判断是可以省略的。
比如 末位的 G,
G+G+E = E 那么G不是0就是5,
所以:for(g=0;g <10;g++)==》for(g=0;g <10;g+=5) //g=g+5
其他的几位也可以推算一下,
粗略限制一下循环条件 ~
[解决办法]
没必要那么复杂的代码吧。
enum {A, B, C, D, E, F, G, X, Y, Z};
bool test(const vector <int> & v)
{
if (v[A] == 0 || v[D] == 0 || v[X] == 0)
{
return false;
}
int ABCDE = v[A] * 10000 + v[B] * 1000 + v[C] * 100 + v[D] * 10 + v[E];
int DFG = v[D] * 100 + v[F] * 10 + v[G];
int XYZDE = v[X] * 10000 + v[Y] * 1000 + v[Z] * 100 + v[D] * 10 + v[E];
if (ABCDE + 2 * DFG == XYZDE)
{
cout < < ABCDE < < "\n " < < DFG < < "\n " < < XYZDE;
return true;
}
return false;
}
int main(int argc, char * argv[])
{
vector <int> v(make_counting_iterator(0), make_counting_iterator(10));
while (next_permutation(v.begin(), v.end()) && !test(v))
{
}
system( "pause ");
return 0;
}