凑算式
B DEF
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
【解析】
看到1-9不同数字,则立马想到全排列,两种解题方式:暴力枚举和递归回溯
注意除法问题怎么解决,两种方式:
1、如题目未事先声明进行整除,消除分母,化为乘法运算,这样可以消除浮点数误差:
A + B/C + D/E = 10 --> ACE + BE + DC = 10CE
2、两个整数相除得到的是整数,所以2/1 和 5/2 得到的结果是一样的,所以此时需要注意将整数转换成浮点数,只要将分子1.0即可:A + B1.0/C + D*1.0/E = 10
方法一:暴力枚举
package 第七届省赛;
public class _3凑算式 {
public static void main(String[] args) {
int count = 0;
for(int a=1; a<=9; a++) {
for(int b=1; b<=9; b++) {
if(b==a) continue;
for(int c=1; c<=9; c++) {
if(c==a||c==b) continue;
for(int d=1; d<=9; d++) {
if(d==a||d==b||d==c) continue;
for(int e=1; e<=9; e++) {
if(e==a||e==b||e==c||e==d) continue;
for(int f=1; f<=9; f++) {
if(f==a||f==b||f==c||f==d||f==e) continue;
for(int g=1; g<=9; g++) {
if(g==a||g==b||g==c||g==d||g==e||g==f) continue;
for(int h=1; h<=9; h++) {
if(h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;
for(int i=1; i<=9; i++) {
if(i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;
/**
* B DEF
A + --- + ------- = 10
C GHI
*/
if((a+ (b*1.0/c)+ (d*100+e*10+f)*1.0/(g*100+h*10+i))==10) {
//由于整数相除的结果仍为整数,所以要将整数转为浮点数计算
count++;
// System.out.print(a+" "+b+" "+c+" "+d+" "+e+" "+f+" "+g+" "+h+" "+i+" ");
// System.out.println(a+" + " + b+"/"+c +" + "+ (d*100+e*10+f)+"/"+g*100+h*10*i +"="+(a+ (b*1.0/c)+ (d*100+e*10+f)*1.0/(g*100+h*10+i)));
}
}
}
}
}
}
}
}
}
}
System.out.println(count);
//当0-9时,果299
//当1-9时,结果29
}
}
方法二:递归回溯
package 第七届省赛;
public class _3凑算式2 {
static int count = 0;
public static void main(String[] args) {
int[] a = new int[9];
int[] b = new int[]{
1,2,3,4,5,6,7,8,9}; //从b里取数
dfs(a,b,0);
System.out.println(count);
}
private static void dfs(int[] a, int[] b, int i) {
if(i==a.length) {
//结束条件
if((a[0]+ (a[1]*1.0/a[2])+ (a[3]*100+a[4]*10+a[5])*1.0/(a[6]*100+a[7]*10+a[8]))==10) //由于整数相除的结果仍为整数,所以要将整数转为浮点数计算
count++;
return;
}
for (int j = 0; j < b.length; j++) {
if(b[j]!=-1) {
a[i] = b[j]; //取数放进容器a里
b[j]=-1; //已使用,标记-1
dfs(a,b,i+1);
b[j] = a[i]; //调用结束了,把容器a里的数还回去
}
}
}
}
结果
29