C++经典编程题目(一)算数计算竖式

1. 给定等式

               A B C D E      
                   D F G      
             +     D F G     
            ─────────────
                X Y Z D E
      

其中每个字母代表一个数字,且不同数字对应不同字母。编程求出这些数字并且打出这个数字的算术计算竖式。

#include <iostream>
#include <stdio.h>
using namespace std;

/*
  A B C D E
      D F G
+     D F G
──────
  X Y Z D E
*/

void printNum(int A, int B, int C, int D, int E, int F, int G, int X, int Y, int Z)
{
	printf("%2d%2d%2d%2d%2d\n", A, B, 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);
}

int main()
{
	int A, B, C, D, E, F, G, X, Y, Z;
	E = 0;
	//(DE+FG+FG)%100=DE ->FG=50
	F = 5; 
	G = 0;
	//Z = (C+D+D+1)%10 && Z !=0
	//Y = (B+(C+D+D+1)/10)%10 
	//X !=A && X=A+1
	//(B+(C+D+D+1)/10)>10 &&  1 <= (C+D+D+1)/10 <= 2  && Y != 0  -> (C+D+D+1)/10 = 2 && B=9 
	//-> (C + D + D + 1)>20 -> C>=5 && D>=5
	B = 9;
	//E = 45 - (A + 9 + C + D + E + 5 + 0 + X + Y + Z) = 31 - A - C - D - X - Y - Z

	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 = (B + (C + D + D + 1) / 10) % 10;
				Z = (C + D + D + 1) % 10;
				E = 31 - A - C - D - X - Y - Z;
				if (((A != B) && (A != C) && (A != D) && (A != E) && (A != F) && (A != G) && (A != X) && (A != Y) && (A != Z))
					&& ((B != C) && (B != D) && (B != E) && (B != F) && (B != G) && (B != X) && (B != Y) && (B != Z))
					&& ((C != D) && (C != E) && (C != F) && (C != G) && (C != X) && (C != Y) && (C != Z))
					&& ((D != E) && (D != F) && (D != G) && (D != X) && (D != Y) && (D != Z))
					&& ((E != F) && (E != G) && (E != X) && (E != Y) && (E != Z))
					&& ((F != G) && (F != X) && (F != Y) && (F != Z))
					&& ((G != X) && (G != Y) && (G != Z))
					&& ((X != Y) && (X != Z))
					&& (Y != Z)
					&& (A * 10000 + B * 1000 + C * 100 + D * 10  + 2 * (D * 100 + F * 10) == 10000 * X + 1000 * Y + 100 * Z + 10 * D ))
				{
					printNum(A, B, C, D, E, F, G, X, Y, Z);
				}
			}
		}
	}

	system("pause");

	return 0;
}
用数组可以更高效的完成循环,这里为了表示清楚所以用了独立的变量;
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值