存粹刷题感悟
凑算式
B DEF
A + — + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中AI代表19的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
答案:29
分析
很明显,用到了全排列+if验证计算个数。
可以用暴力for循环,但一堆for循环套着还是蛮心累的。
最好用全排列或者dfs比较简单,而且真到比赛也不会浪费太多时间在一堆瞎套的for循环还有if验证几个数是否相等上
package 真题2016;
public class cousuanshi3 {
public static int counts=0;//定义全局变量counts,写在外面方便计算
public static void main(String[] args) {
// 主要还是用全排列,或bfs
int[]a= {1,2,3,4,5,6,7,8,9};
quanpailie(a,0);
System.out.println(counts);
}
public static void quanpailie(int[]a,int start) {
if(start==a.length) {
int A=a[0];
int B=a[1];
int C=a[2];
int D=a[3]*100+a[4]*10+a[5];//这里必须先是整数
int E=a[6]*100+a[7]*10+a[8];//这里必须先是整数
if(A+B*1.00/C+D*1.00/E==10) {//最后验证结果运算再一起化为浮点,这与里头自己计算机制有关,只需*1.00即可
counts++;
}
}else {
for(int i=start;i<a.length;i++) {
swap(a,i,start);//回溯
quanpailie(a,start+1);
swap(a,i,start);
}
}
}
public static void swap(int[]a,int i,int j) {//交换函数
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}