开始写写博客,做做笔记,学习学习。
给定等式 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; }
运行结果如下:
总之这上面的程序都不是我想要的结果,希望可以看到大神们的算法。