三羊献瑞+祥瑞生辉(15年蓝桥杯)

2015年蓝桥杯JavaB组第3题


三羊献瑞

观察下面的加法算式:

      祥 瑞 生 辉
  +   三 羊 献 瑞
-------------------
   三 羊 生 瑞 气

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

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

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


感觉这种题以前学奥数时见过类似的,不过可没这么多不同的汉字,这完全可以作为奥数题出。

做完这道题后,在网上查了查,见到的都是纯粹暴搜,设置8个变量从0到9。然而我自己的解题思路感觉还好,写出来分享下。


首先进行数学分析:

1.四位数加四位数得到五位数,那么这个五位数的万为必为 1 ,即三为 1 。

2.相加时,百位向千位进数,只能是 0 / 1 ,可得:祥 + 1 +0/1 = 10 + 羊。

本人数学不是很好,所以数学分析就到这一步了。但这个算式还可以在分析。


        祥 瑞 献 辉
  +    三 羊 生 瑞
-------------------
   三 羊 生 瑞 气


把  “生” 和 “献” 调换位置,这样不影响结果,设 “三羊生瑞” 为 X ,“祥瑞献辉” 为 Y ,(PS:这两个词感觉怪怪的),那么就有  X+Y+0 <= 10*X  <= X+Y+9(谁知道那个“气”是几,但是其必定大于等于0、小于等于9),转换一下就是  Y = 10 * X + (0,,1,2,3...),即  Y = 9&#¥。可得“祥”为 9 。 9 + 1 在 进数为 0/1 的情况下结果为 10/11,但 1 已经被“三”占用了,“羊”只能为 0 。

综上所述:1023<=X<=1987 && Y<10000 ,再加上题中“相同的汉字代表相同的数字,不同的汉字代表不同的数字”的约束条件, 剩下的就交给电脑跑循环吧。

import java.util.*;
public class Main {
	/*
	 * 该题的这种做法,涉及对字符串的处理,建议使用正则表达式
	 * 或者将 x 和 y 拆分成8个数字进行筛选
	 */
	 public static void main(String[] args) {
		 int x, y;
		 for( x=1023; x<1987; x++){
			 for( y=x*9; y<=(x*9+9) && y<10000; y++){
				 if( x%10 == y/100%10 && (x+y)/10%10 == x%10 && y/1000 != y%1000/100 && y/1000 != y%100/10 && y/1000 != y%10 
						 && y%100/10 != y%10 && x%1000/100 != x%100/10 && x%100/10 != x%10 && x%100/100 != x%10){
					 System.out.println(x + "  " + y);
				 }
			 }
		 }
	}
}


最后,输出的跟题意有些矛盾,毕竟我修改了原数,而且我没有在代码里进行筛选,而是在输出后人工筛选,毕竟还不会正则。希望大家提出更好的算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值