版权声明:一辈子做程序员有何不可? https://blog.csdn.net/yoyo18520/article/details/8681578
开始写写博客,做做笔记,学习学习。
给定等式 A B C D E 其中每个字母代表一个数字,且不同数字对应不
D F G 同字母。编程求出这些数字并且打出这个数字的
+ D F G 算术计算竖式。
──────—
X Y Z D E
这道题据说是C++入门必做的题目,想了半天,想出很多for循环嵌套的方法感觉不靠谱,但还是贴出来吧。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int A, B, C, D, E, F, G, X, Y, Z;
for(A = 0; A < 10; A++)
{
for(B = 0; B < 10; B++)
{
if(A == B) continue;
for(C = 0; C < 10; C++)
{
if(A == C || B == C) continue;
for(D = 0; D < 10; D++)
{
if(A == D || C == D || B == D) continue;
for(E = 0; E < 10; E++)
{
if(A == E || B == E || C == E || D == E) continue;
for(F = 0; F < 10; F++)
{
if(A == F || B == F || C == F || D == F || E == F) continue;
for(G = 0; G < 10; G++)
{
if(A == G || B == G || C == G || D == G || E == G || F == G) continue;
for(X = 0; X < 10; X++)
{
if(A == X || B == X || C == X || D == X || E == X || F == X || G == X) continue;
for(Y = 0; Y < 10; Y++)
{
if(A == Y || B == Y || C == Y || D == Y || E == Y || F == Y || G == Y || X == Y) continue;
for(Z = 0; Z < 10; Z++)
{
if(A == Z || B == Z || C == Z || D == Z || E == Z || F == Z || X == Z || Y == Z) continue;
if(A * 10000 + B * 1000 + C * 100 + D * 10 + E + 2 * (D * 100 + F * 10 + G) == X * 10000 + Y * 1000 + Z * 100 + D * 10 + E)
{
printf(" %d%d%d%d%d\r\n", A, B, C, D, E);
printf(" %d%d%d\r\n", D, F, G);
printf("+ %d%d%d\r\n", D, F, G);
printf("————————————————————\r\n");
printf(" %d%d%d%d%d\r\n", X, Y, Z, D, E);
printf("*************分割线************\r\n");
}
}
}
}
}
}
}
}
}
}
}
system("pause");
return 0;
}
运行结果如下:
后来经过思考,想到了比这个稍微优化了一点,似乎有点换汤不换药的感觉。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int A, B, C, D, E, F, G, X, Y, Z;
//从题目中可以很轻松地得出F=5, G=0,B=9, X=A+1
//如果说我没有根据,不妨自己推断一下
F = 5;
G = 0;
B = 9;
int n = 0;
for(A = 1; A < 9; A++)
{
for(C = 1; C < 9; C++)
{
if(A == C || B == C) continue;
for(D = 1; D < 9; D++)
{
if(A == D || C == D || B == D) continue;
for(E = 1; E < 9; E++)
{
if(A == E || B == E || C == E || D == E) continue;
for(F = 1; F < 9; F++)
{
if(A == F || B == F || C == F || D == F || E == F) continue;
X = A + 1; //由开始的推断得出
if(X == B || X == C || X == D || X == E || X == F || X == G) continue;
for(Y = 1; Y < 9; Y++)
{
if(A == Y || B == Y || C == Y || D == Y || E == Y || F == Y || G == Y || X == Y) continue;
for(Z = 1; Z < 9; Z++)
{
if(A == Z || B == Z || C == Z || D == Z || E == Z || F == Z || X == Z || Y == Z) continue;
if(A * 10000 + B * 1000 + C * 100 + D * 10 + E + 2 * (D * 100 + F * 10 + G) == X * 10000 + Y * 1000 + Z * 100 + D * 10 + E)
{
printf(" %d%d%d%d%d\r\n", A, B, C, D, E);
printf(" %d%d%d\r\n", D, F, G);
printf("+ %d%d%d\r\n", D, F, G);
printf("————————————————————\r\n");
printf(" %d%d%d%d%d\r\n", X, Y, Z, D, E);
printf("*************分割线************\r\n");
n++;
}
}
}
}
}
}
}
}
printf("总共有%d个式子\r\n", n);
system("pause");
return 0;
}
运行结果如下:
总之这上面的程序都不是我想要的结果,希望可以看到大神们的算法。