日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

枚举(穷举)算法

發(fā)布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 枚举(穷举)算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

枚舉(窮舉)算法

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

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

例: 填數(shù)字游戲
ABCDE
X ????? E
————
EEEEEE
問A,B,C,D,E各為多少?
代碼如下:

#include<stdio.h> int main(void) {int A,B,C,D,E;long int aim,result;for(A=0;A<=9;A++){for(B=0;B<=9;B++){for(C=0;C<=9;C++){for(D=0;D<=9;D++){for(E=1;E<=9;E++){result=A*10000+B*1000+C*100+D*10+E;aim=E*100000+E*10000+E*1000+E*100+E*10+E;if(result*A==aim){printf("A=%d,B=%d,C=%d,D=%d,E=%d\n",A,B,C,D,E);printf("%d%d%d%d%d\n",A,B,C,D,E);printf("X %d\n",A);printf("------\n");printf("%d\n",aim);}}}}}}return 0; }

例: 填運(yùn)算符
5 [運(yùn)算符1] 5 [運(yùn)算符2] 5 [運(yùn)算符3] 5 [運(yùn)算符4] 5 = 5
問運(yùn)算符各位啥滿足等式,且該等式不能用括號。

分析 由于算術(shù)表達(dá)式的特殊性,在編程求解這個算法時,需要注意已下幾點(diǎn): 當(dāng)填入除號時,要求右側(cè)的數(shù)不能為0. 乘除的運(yùn)算級別比加減高。 那么?問題是如何先算乘除再算加減呢? 假設(shè)5的最前面還有一個0 即 0+5 5 5 5 5 用一個變量left來儲存操作符左邊的和 用一個變量right來存儲操作出右變的和。 所以 left初始是=0 right初始是=5 我們知道計(jì)算式是從左到右依次累加 再用一個sign變量來判斷累加運(yùn)算時的符號 分析一下 0+5*5-5*5+5=5 第一個操作符*號時:left不變 right=25 第二個操作符-號時:left=left+right=25,right=5,累加的符號是負(fù)號 第三個操作符*號時:right=25 left不變 第四個操作符+號時: left=left-rght=25-25=0 right=5 累加的符號是正號 最后 left=left+sign*right 即左邊加右邊累加。 此時的右邊的數(shù)已經(jīng)沒有了left就是最終的結(jié)果 判斷l(xiāng)eft等不等于結(jié)果5就可以了 綜上分析: 先以第一個虛擬的+號為分隔符 left等于加號左邊的數(shù)=0 right等于加號右邊的數(shù)=5*5=25 再以-號為分隔符 left等于減號左邊的數(shù)的和=25 right等于減號右邊的數(shù)=5*5=25 再以+號為分隔符 left等于加號左邊的數(shù)的和=25-25=0 right等于加號右邊的數(shù)=5 這時沒有操作符了left+right就是最終等式的結(jié)果

代碼如下:

#include<stdio.h> int main() {int j,i[5];循環(huán)變量,數(shù)組i用來表示4個運(yùn)算符int sign;//累加運(yùn)算時的符號int result;//保存運(yùn)算式的結(jié)果值int count=0;//計(jì)數(shù)器,統(tǒng)計(jì)符合條件的方案int num[6];//保存操作數(shù)float left,right;//保存中間結(jié)果char oper[5]={' ','+','-','*','/'};//運(yùn)算符printf("請輸入5個數(shù): ");for(j=1;j<=5;j++){scanf("%d",&num[j]);}printf("請輸入結(jié)果:");scanf("%d",&result);//循環(huán)4種運(yùn)算符,1表示+,2表示-,3表示*,4表示'\'for(i[1]=1;i[1]<=4;i[1]++)//第一個操作符{if( (i[1]<4) || (num[2]!=0) )//運(yùn)算符是'/'且除數(shù)是0不滿足{for(i[2]=1;i[2]<=4;i[2]++)//第二個操作符{if( (i[2]<4) || (num[3]!=0) )//運(yùn)算符是'/'且除數(shù)是0不滿足{for(i[3]=1;i[3]<=4;i[3]++)//第三個操作符{if( (i[3]<4) || (num[4]!=0) )//運(yùn)算符是'/'且除數(shù)是0不滿足{for(i[4]=1;i[4]<=4;i[4]++)//第四個操作符{if( (i[4]<4) || (num[5]!=0) )//運(yùn)算符是'/'且除數(shù)是0不滿足{left=0;right=num[1];sign=1;for(j=1;j<=4;j++){switch(oper[i[j]]){case '+':left=left+sign*right;sign=1;right=num[j+1];break;case '-':left=left+sign*right;sign=-1;right=num[j+1];break;//通過sign=-1實(shí)現(xiàn)減法case '*':right=right*num[j+1];break;case '/':right=right/num[j+1];//實(shí)現(xiàn)除法break;}}if(left+sign*right==result){count++;printf("%3d: ",count);for(j=1;j<=4;j++){printf("%d%c",num[j],oper[i[j]]);}printf("%d=%d\n",num[5],result);}}}}}}}}}if(count==0){printf("沒有符合要求的方法\n");} }

總結(jié)

以上是生活随笔為你收集整理的枚举(穷举)算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。