【每日蓝桥】26、一五年省赛Java组真题“三羊献瑞”

你好呀,我是灰小猿,一个超会写bug的程序猿!

欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!

标题:三羊献瑞

观察下面的加法算式:

   祥 瑞 生 辉

+ 三 羊 献 瑞

------------------------

三 羊 生 瑞 气

(如果有对齐问题,可以参看【图1.jpg】)

其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字,

请你填写“三羊献瑞”所代表的4位数字,(答案唯一),不要填写任何多余内容

解题思路:

这道题的抽象性比较强,所以我们可以将题目换个式子进行表示,将题中的汉字换成字母来表示,我们可以按照加法的思想来推断这个式子中字母所代表的数字,如下图所示:

如:两个四位数相得到了一个五位数,那么这个五位数的第一位一定是1,也就是说e=1,既然e=1且a+e应该是能够进位的才对,也就是a+e>=10,当e=1时显然只有a=9符合条件;这时得到f=0,当f=0时,b+f=c,且b一定是不等于c的,这就说明b是得到了一个进位的,即c=b+1,既然是进位,那么c+g只有大于10的时候才会进位,之所以不能等于10,是因为f=0导致b不能等于0,所以得到c+g>10,

到目前,我们已经推断出来的是:e=1,a=9,f=0,c=b+1,c+g>10,且每一个字母代表的数字都不能相同,

这样我们可以利用枚举来列举出还不确定值的字母可能代表的数字,然后判断是否符合两数相加得第三个数,

答案源码:

public class Year2015_Bt3 {

	public static void main(String[] args) {
//		由于e=1,a=9,f=0已经确定,所以之后的字母应该避开这几个数字
		for (int b = 2; b < 9; b++) {
			int c = b+1;
			for (int d = 2; d < 9; d++) {
				//如果d等于a、b、c的任意一个数字,则进行下一次循环
				if (d==b||d==c) {
					continue;
				}
				for (int g = 2; g < 9; g++) {
//					判断g是否等于之前的任意一个数字
					if (g==b||g==c||g==d) {
						continue;
					}
					if (c+g>10) {
						int add1 = 9000+b*100+c*10+d;	//求出第一个加数
						int add2 = 1000+g*10+b;			//求出第二个加数
						for (int i = 2; i < 9; i++) {
//							判断i是否等于之前的任意一个数字
							if (i==b||i==c||i==d||i==g) {
								continue;
							}
							int addAns = 10000+c*100+b*10+i;	//求出两数的和
//							判断两数相加得到的结果是否等于和
							if (add1+add2==addAns) {
								System.out.println("10" + g + b);	
							}	
						}
						
					}
					
				}
				
			}	
		}
	}

}

输出样例:

其中有不足或者改进的地方,还希望小伙伴留言提出,一起学习!

感兴趣的小伙伴可以关注专栏!

灰小猿陪你一起进步!

猜你喜欢

转载自blog.csdn.net/weixin_44985880/article/details/114490619