本题来源于蓝桥杯
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA,他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!“华生:“我猜也是!” 于是,两人沉默了好久,还是没有算出合适的结果来。请你利用计算机找到破解的答案。 把 ABCDE 所代表的数字写出来。
思路:
ABCDE代表0~9之间的数字,其最大阈值为987654,目前还无法确定最小阈值。我们来确定下A的值,其值不可能为0,因为若为0的话,根据等式E也得为0。故初步可得ABCDE范围:10000~987654;
本题目的是要确定每个字母的值,那么我们要把每个字母分别分离出来,在遍历范围内得到每个字母的值,此处是本题的难点。
例如:a是一个3位数,那么:
百位:a/100;
十位:a%100/10;
个位:a%10;
结论:”%“(模)多少(几个0)就表示留多少位(从后往前数);“/”(商)多少(几个0)就表示删多少位(从后往前删)。
概括就是:几个0留几位,几个0删几位。(都是从后往前来)
比如b=2578, 那么
b%1000=578(从后往前数留三位);
b%100=78(从后往前数留两位);
b/1000=2(从后往前删3位);
b/100=25(从后往前删2位);
b/10=257(从后往前删1位);
然后建立模型,判断条件就是Y?=e*10000+d*1000+c*100+b*10+a;Y就是EDCBA的值;
package que21;
public class que21 {
public static void main(String[] args) {
//System.out.println("cuowu");
// TODO Auto-generated method stub
for(int i=10000;i<=98765;i++){
int a=i/10000;//取最高位
int b=i%10000/1000;//次之
int c=i%1000/100;
int d=i%100/10;
int e=i%10;//取最低位
if(a==b||a==c||a==d||a==e||b==c||b==d||b==e||c==d||c==e||d==e)
continue;
int edcba=e*10000+d*1000+c*100+b*10+a;//判断条件
if(edcba%i==0)//如果Y能够整除i,就代表找到合适的i值、?值
System.out.println(i+"*"+edcba/i+"="+edcba);
}
}
}