您的位置:首页 > 其它

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

2015-12-01 15:50 1376 查看
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);
}
}
}
}
}

最后,输出的跟题意有些矛盾,毕竟我修改了原数,而且我没有在代码里进行筛选,而是在输出后人工筛选,毕竟还不会正则。希望大家提出更好的算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  蓝桥杯 算法 ACM