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

来源:互联网 发布:淘宝盒子流量真实吗 编辑:程序博客网 时间:2024/04/28 22:21

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); } } }}}


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

0 0
原创粉丝点击