第七届蓝桥杯java语言题目之凑算式
第一部分:题目
凑算式
B DEF
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见下图)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
这个题不多说了,可以直接暴力生成9的全排列然后去验证等式是否成立,只是验证的时候如果防止精度问题可以通分把除法变成乘法。
直接给出全排列算法,DFS算法 ,大家随意选择。。。。。
package LX;
public class 凑算式_全排列{
static int count = 0;
public static void main(String[]args){
int[] a = {0,1,2,3,4,5,6,7,8,9};
f(1,a);
System.out.println(count);
}
public static void f(int k,int[] a){
if(k==a.length-1&&check(a)){
count++;
return ;
}
for(int i=k;i<a.length;i++){
int t = a[i];
a[i] = a[k];//互换位置
a[k] = t;
f(k+1,a); //递归
t = a[i];
a[i] = a[k];//回溯
a[k] = t;
}
}
public static boolean check(int[]a){
boolean flag = false;
int DEF = a[4]*100+a[5]*10+a[6];
int GHI = a[7]*100+a[8]*10+a[9];
int result = a[1]*GHI*a[3] + a[2]*GHI + a[3]*DEF - 10*a[3]*GHI;
if(result==0){
flag = true;
}
return flag;
}
}
package LX;
public class 凑算式_DFS{
//标记使用位置元素
static int[] visited = new int[10];
//记录搜索路径;
static int[] path = new int[10];
static int count = 0;
public static void main(String[]args){
DFS(1);
System.out.println(count);
}
public static void DFS(int k){
if(k==path.length&&check(path)){
count++;
return ;
}
for(int i=1;i<visited.length;i++){
if(visited[i]==0){
visited[i] = 1;
path[k] = i;
DFS(k+1);
visited[i] = 0;
}
}
}
public static boolean check(int[]a){
boolean flag = false;
int DEF = a[4]*100+a[5]*10+a[6];
int GHI = a[7]*100+a[8]*10+a[9];
int result = a[1]*GHI*a[3] + a[2]*GHI + a[3]*DEF - 10*a[3]*GHI;
if(result==0){
flag = true;
}
return flag;
}
}