每日算法之解法数目
1 package Computational; 2 3 public class Main { 4 static int count = 0; 5 public static void main(String args[]){ 6 char[] str = "123456789".toCharArray(); 7 paixu(str,0,8); 8 System.out.print(count); 9 } 10 //我们为了让每个数字都出现在每个位置使用交换 11 static void swap(char[] str,int a,int i){ 12 char temp; 13 temp = str[a]; 14 str[a] = str[i]; 15 str[i] = temp; 16 } 17 //还需要一个函数来检验是否合格 18 static boolean check(char[] str){ 19 double[] num =new double[10]; 20 for(int i=0;i<9;++i) 21 num[i] = str[i]-'0';//因为这是char数组,所以int(‘0’)=48,需要还原成int数组,-‘0’刚好 22 if(num[0]+num[1]/num[2]+(num[3]*100.0+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8])==10) 23 return true; 24 return false; 25 } 26 static void paixu(char[] str,int a,int b){ 27 if(a==b){ 28 if(check(str)){ 29 ++count; 30 System.out.println(str); 31 } 32 } else { 33 for(int i=a;i<=b;++i){ 34 swap(str,i,a); 35 paixu(str,a+1,b); 36 swap(str,i,a); 37 } 38 39 } 40 } 41 }
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。(比赛时,题目有改动)
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
可以看出要是使用for循环的话肯定是不够好的,而且还需要是十for循环
所以想到递归
1-9 9个数字,我们有9!种排列
但是我们想想只需要考虑每个数字在每个位置都有出现就好