一道题_20130316

版权声明:一辈子做程序员有何不可? 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;
}
运行结果如下:


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

猜你喜欢

转载自blog.csdn.net/yoyo18520/article/details/8681578