枚舉法的本質(zhì)就是從所有候選答案中搜索正確的解旅掂,使用該算法需要滿足兩個條件:
- 可預(yù)先確定候選答案的數(shù)量烘豹。
- 候選答案的范圍在求解之前必須有一個確定的集合凭豪。
填數(shù)游戲 (即 ABCDE * A = EEEEEE)
每個字母表示從0~9的一個整數(shù)汁蝶,且不同字母之間代表的整數(shù)是不同的隐锭,要求找出這些字母表示的整數(shù)窃躲,使得算式成立。
這種類型的題目有兩個特點:
- 無規(guī)律性钦睡,也就是我們沒有辦法按照一定的規(guī)律從眾多的候選答案中找到正解蒂窒。
- 有窮性,也就是說這種題目在計算量上總會有一個上界荞怒,要么在上界范圍內(nèi)即可得出正解洒琢,要么不存在正解。
字母 | 變量 | 變量范圍 |
---|---|---|
A | i | 1-9 |
B | j | 0-9 |
C | k | 0-9 |
D | l | 0-9 |
E | r | 1-9 |
然后窮舉所有可能性褐桌,直到滿足條件為止衰抑。
public class FindCalu {
public static void main(String[] args) {
for(int i=1;i<=9;i++) {
for(int j=0;j<=9;j++) {
for(int k=0;k<=9;k++) {
for(int l=0;l<=9;l++) {
for(int r=0;r<=9;r++) {
//計算的時候記得要用long型
long mul=i*10000+j*1000+k*100+l*10+r;
long res=r*111111;
if(mul*(long)i==res) {
System.out.println(mul+"*"+i+"="+res);
}
}
}
}
}
}
}
}
填運算符
5 5 5 5 5=5 (中間的空間填的是運算符)。
即通過加減乘除來等于相應(yīng)的結(jié)果數(shù)撩嚼。
注意:
- 除號后面的被除數(shù)一定不為0
- 乘除法的優(yōu)先級比加減法的優(yōu)先級高
分析:
- 先把已經(jīng)計算過的結(jié)果存儲到一個變量名為left中停士,準(zhǔn)備和下一個數(shù)字進行運算(待運算的第一個數(shù)據(jù)存儲到另一個變量名為right中)兩個變量均為double型;
- 如果為加/減則為順序計算:left = left +or- right完丽;
如果為乘除恋技,則先計算當(dāng)前乘除部分: right = *or/ num[下一個數(shù)據(jù)],作為下一個數(shù)字進行運算
如果為除則下一個運算數(shù)據(jù)不能為0才能繼續(xù)運算:if (i[當(dāng)前] < 4 || num[下一個數(shù)據(jù)] 逻族!= 0){……}蜻底; (注意) - left初始值為0,right初始值為輸入待運算的第一個數(shù)聘鳞;
- 運算完之后篩選判斷:if (left + right == result) 計數(shù)器自增薄辅,輸出;如果全部結(jié)束計數(shù)器為零抠璃,則表示無所需結(jié)果站楚;
import java.util.Scanner;
public class FindOper {
public static void main(String[] args) {
char oper[]=new char[]{' ','+','-','*','/'}; //操作符號,稍微注意一下
int type[] = new int[5]; //存放操作符號順序
int flag=1;//1為正數(shù),-1為負(fù)數(shù)
double left,right;
int count=0;
int num[]=new int[6];
Scanner input=new Scanner(System.in);
for(int i=1;i<=5;i++) {
num[i]=input.nextInt();
}
int result=input.nextInt();
input.close();
for(type[1]=1;type[1]<=4;type[1]++) {
if(type[1]<4||num[2]!=0) {
for(type[2]=1;type[2]<=4;type[2]++) {
if(type[2]<4||num[3]!=0) {
for(type[3]=1;type[3]<=4;type[3]++) {
if(type[3]<4||num[4]!=0) {
for(type[4]=1;type[4]<=4;type[4]++) {
if(type[4]<4||num[5]!=0) {
left=0;
right=num[1];
flag=1;
for(int o=1;o<=4;o++) {
switch(oper[type[o]]) {
case '+':{
left=left+right*flag;
right=num[o+1];
flag=1;
break;
}
case '-':{
left=left+right*flag;
right=num[o+1];
flag=-1;
break;
}
case '*':{
right=right*num[o+1];
break;
}
case '/':{
right=right/num[o+1];
break;
}
}
}
if(left+flag*right==result) {
count++;
for(int a=1;a<=4;a++) {
System.out.print(""+num[a]+oper[type[a]]);
}
System.out.print(num[5]+"="+result);
System.out.println();
}
}
}
}
}
}
}
}
}
if(count==0) {
System.out.println("無搏嗡!");
}
}
}