題目
/* 湊算式 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 }
注釋
就本題目而言用暴力破解會更省事一點,其中要注意的一個小問題就是,整數相除得整數,要細心一點。由本題目牽扯到的全排列方面的算法我會再寫一篇博客