枚舉算法

枚舉法的本質(zhì)就是從所有候選答案中搜索正確的解,使用該算法需要滿足兩個(gè)條件:

  1. 可預(yù)先確定候選答案的數(shù)量。
  2. 候選答案的范圍在求解之前必須有一個(gè)確定的集合。

填數(shù)游戲 (即 ABCDE * A = EEEEEE)

每個(gè)字母表示從0~9的一個(gè)整數(shù),且不同字母之間代表的整數(shù)是不同的,要求找出這些字母表示的整數(shù),使得算式成立。
這種類型的題目有兩個(gè)特點(diǎn):

  1. 無規(guī)律性,也就是我們沒有辦法按照一定的規(guī)律從眾多的候選答案中找到正解。
  2. 有窮性,也就是說這種題目在計(jì)算量上總會有一個(gè)上界,要么在上界范圍內(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++) {
                            //計(jì)算的時(shí)候記得要用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);
                            }
                        }
                    }
                }
            }
        }
    }
}

填運(yùn)算符

5 5 5 5 5=5 (中間的空間填的是運(yùn)算符)。
即通過加減乘除來等于相應(yīng)的結(jié)果數(shù)。
注意:

  1. 除號后面的被除數(shù)一定不為0
  2. 乘除法的優(yōu)先級比加減法的優(yōu)先級高

分析:

  1. 先把已經(jīng)計(jì)算過的結(jié)果存儲到一個(gè)變量名為left中,準(zhǔn)備和下一個(gè)數(shù)字進(jìn)行運(yùn)算(待運(yùn)算的第一個(gè)數(shù)據(jù)存儲到另一個(gè)變量名為right中)兩個(gè)變量均為double型;
  2. 如果為加/減則為順序計(jì)算:left = left +or- right;
    如果為乘除,則先計(jì)算當(dāng)前乘除部分: right = *or/ num[下一個(gè)數(shù)據(jù)],作為下一個(gè)數(shù)字進(jìn)行運(yùn)算
    如果為除則下一個(gè)運(yùn)算數(shù)據(jù)不能為0才能繼續(xù)運(yùn)算:if (i[當(dāng)前] < 4 || num[下一個(gè)數(shù)據(jù)] != 0){……}; (注意)
  3. left初始值為0,right初始值為輸入待運(yùn)算的第一個(gè)數(shù);
  4. 運(yùn)算完之后篩選判斷:if (left + right == result) 計(jì)數(shù)器自增,輸出;如果全部結(jié)束計(jì)數(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("無!");
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 完美立方: //a的三次方等于a,b,c三個(gè)數(shù)的立方之和,這一組數(shù)稱為完美立方 #includeusing nam...
    Tangbh閱讀 754評論 0 0
  • 算法簡介 這是一種入門級的算法,它是利用計(jì)算機(jī)運(yùn)算速度快、精確度高的特點(diǎn),對要解決問題的所有可能情況,一個(gè)不漏地進(jìn)...
    xiaoshua閱讀 452評論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,890評論 0 33
  • 我覺得好遺憾。不久前我在微博上看到“魚兒”,我很喜歡它,冬天就快要冰凍人們的心,我知道那種苦痛的感覺,無家可歸的它...
    KootaU閱讀 464評論 1 3
  • 最近有一些之前做淘客運(yùn)營朋友,想學(xué)習(xí)一些店鋪淘客運(yùn)營技巧,也是不厭其煩的來找我。其實(shí)我是很懶的,我在很多群里,很多...
    且隨你閱讀 238評論 0 0

友情鏈接更多精彩內(nèi)容