第七届蓝桥杯javaB组真题解析-凑算式(第三题)
题目
/* 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见【图1.jpg】) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。 比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。 这个算式一共有多少种解法? 注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。 */
图1
答案
29
代码
1 public class Main { 2 public static void main(String[] args) { 3 //实现 元素都不相同的全排列 简单的方法可以用暴力破解的方法 只要把循环中有重复数字的结果剔除就可以 4 int a, b, c, d, e, f, g, h, i, s=0; 5 for(a=1;a<10;a++){ 6 for(b=1;b<10;b++){ 7 if(b==a) continue; 8 for(c=1;c<10;c++){ 9 if(c==a||c==b) continue; 10 for(d=1;d<10;d++){ 11 if(d==a||d==b||d==c) continue; 12 for(e=1;e<10;e++) { 13 if(e==a||e==b||e==c||e==d) continue; 14 for(f=1;f<10;f++){ 15 if(f==a||f==b||f==c||f==d||f==e) continue; 16 for(g=1;g<10;g++){ 17 if(g==a||g==b||g==c||g==d||g==e||g==f) continue; 18 for(h=1;h<10;h++){ 19 if(h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue; 20 for(i=1;i<10;i++){ 21 if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue; 22 //其中要注意的是,两个整数相除得到的还是整数,所以要把其中一个整数先乘以 1.0 转化成浮点数 (建议乘在分子上,因为计算顺序不容易出错) 23 double num = a + b*1.0/c + (100*d+10*e+f)*1.0/(100*g+10*h+i)-10; 24 if(num==0) { 25 s++; 26 //下面会显示结果项 27 /*System.out.println(" "+b+" "+d+""+e+""+f+""); 28 System.out.println(""+a+" + --- + ------- = 10"); 29 System.out.println(" "+c+" "+g+""+h+""+i+""); 30 System.out.println(a+" "+b*1.0/c+" "+(100*d+10*e+f)*1.0/(100*g+10*h+i)); 31 System.out.println(); 32 System.out.println();*/ 33 } 34 } 35 } 36 } 37 } 38 } 39 } 40 } 41 } 42 } 43 System.out.println(s); 44 } 45 }
注释
就本题目而言用暴力破解会更省事一点,其中要注意的一个小问题就是,整数相除得整数,要细心一点。由本题目牵扯到的全排列方面的算法我会再写一篇博客