算法学习——枚举之完美综合式
算法描述
要求
- 各个一位数不能是1
- 只能填写1~9的数字
- 方框里的数字不能重复
算法思路
-
首先是将每个一位数和两位数都看成一个数,我们可以使用a,b,c,d,e,f六个数代替
-
设置for循环,枚举a,b,c,d,e,f这六个数
a 范围2~9(因为是不允许各个一位数为1)
b 范围2~9(同理)
c 范围10~99
d 范围10~99
e 范围10~99
f 范围2~9
这里需要注意的是c和d的枚举,设置的时候有些巧妙,由于d是被除数,所以我们
优先改变的应该是c
,而且,由题目我们可以猜测出,这里的c和d应该是可以整除的,所以我们可以将c作为d的倍数增加for(d=10;d<=99;d++)
for(c=d;c<=99;c=c+d)
-
乘方函数可以使用java中Math.pow函数
-
设置一个函数判断式子是否成立,成立则返回true,不成立则返回false
-
设置一个函数判断式子中的各个数是否包含0,是否重复,返回类型也是一个boolean类型
-
上述两个函数返回的数值均是true则可以判断a,b,c,d,e,f是满足要求的数字,打印出来(或者是使用整除和取余的方法一个个数的取出)
算法实现
int a,b,c,d,e,f;
for(a=2;a<=9;a++){
for(b=2;b<=9;b++){
for(d=10;d<=99;d++){
for(c=d;c<=99;c=c+d){
for(e=10;e<=99;e++){
for(f=2;f<=9;f++){
if(jisuan(a, b, c, d, e, f)){
if(isChongfu(a, b, c, d, e, f)){
System.out.println(a+","+b+","+c+","+d+","+e+","+f);
}
}
}
}
}
}
}
}
}
public static boolean jisuan(int a,int b,int c,int d,int e,int f){
return (Math.pow(a, b) + c/d )==e*f;
}
public static boolean isChongfu(int a,int b,int c,int d,int e,int f){
int[] flag = new int[9];
flag[0]=a;
flag[1]=b;
flag[2]=c/10;
flag[3]=c%10;
flag[4]=d/10;
flag[5]=d%10;
flag[6]=e/10;
flag[7]=e%10;
flag[8]=f;
for(int i=0;i<flag.length;i++){
if(flag[i]==0){
return false;
}
}
for(int i=0;i<flag.length-1;i++){
for(int j=i+1;j<flag.length;j++){
if(flag[i]==flag[j]){
return false;
}
}
}
return true;
}