一道题_20130316

来源:互联网 发布:系统性能监控软件 编辑:程序博客网 时间:2024/06/05 00:22

开始写写博客,做做笔记,学习学习。


给定等式  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;}
运行结果如下:


总之这上面的程序都不是我想要的结果,希望可以看到大神们的算法。

原创粉丝点击