匪警请拨110
? ? 匪警請撥110,即使手機欠費也可撥通!
??? 為了保障社會秩序,保護人民群眾生命財產安全,警察叔叔需要與罪犯斗智斗勇,因而需要經常性地進行體力訓練和智力訓練!
??? 某批警察叔叔正在進行智力訓練:
??? 12 3 4 5 6 7 8 9 = 110;
??? 請看上邊的算式,為了使等式成立,需要在數字間填入加號或者減號(可以不填,但不能填入其它符號)。之間沒有填入符號的數字組合成一個數,例如:12+34+56+7-8+9 就是一種合格的填法;123+4+5+67-89 是另一個可能的答案。
??? 請你利用計算機的優勢,幫助警察叔叔快速找到所有答案。
??? 每個答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
??? 已知的兩個答案可以輸出,但不計分。??
??? 各個答案的前后順序不重要。
方法1:暴力求解
#include "stdio.h" void main() {int a[9]={1,2,3,4,5,6,7,8,9};int oper[8];for(oper[0]=-1;oper[0]<=1;oper[0]++)for(oper[1]=-1;oper[1]<=1;oper[1]++)for(oper[2]=-1;oper[2]<=1;oper[2]++)for(oper[3]=-1;oper[3]<=1;oper[3]++)for(oper[4]=-1;oper[4]<=1;oper[4]++)for(oper[5]=-1;oper[5]<=1;oper[5]++)for(oper[6]=-1;oper[6]<=1;oper[6]++)for(oper[7]=-1;oper[7]<=1;oper[7]++){int index=0; int sum=0; int number=0;int lastoper=1;while(index<8){for(;oper[index]==0; index++){number=number*10+a[index];}number=number*10+a[index];sum=(lastoper==1)?(sum+number):(sum-number);lastoper=oper[index];index++;number=0;}if(oper[7]==1)sum=sum+a[8];else if (oper[7]==-1)sum=sum-a[8];if (sum==110){for(int i=0;i<9;i++){printf("%d",a[i]);if(oper[i]==1 && i<8)printf("+");else if(oper[i]==-1 && i<8)printf("-");}printf("\n");}} }
方法2:改進的暴力搜索
#include "stdio.h"void main() {int a[9]={1,2,3,4,5,6,7,8,9};for(int num=0;num<6561;num++){int sum=0; int temp=1; int oper=1;int number=num;for(int i=1;i<=8;i++){int rest=number%3; number=number/3;if (rest==0) temp=temp*10+a[i];if (rest==1) {if(oper==1){sum=sum+temp; temp=a[i];}if(oper==2){sum=sum-temp; temp=a[i];}oper=rest;}if(rest==2){if(oper==1){sum=sum+temp; temp=a[i];}if(oper==2){sum=sum-temp; temp=a[i];}oper=rest;}}if(oper==1) sum=sum+temp;if(oper==2) sum=sum-temp; if(sum==110){number=num;for(int i=1;i<=8;i++){printf("%d",a[i-1]);int rest=number%3; number=number/3;if(rest==1) printf("+");if(rest==2) printf("-");} printf("9\n");}} }
3、遞歸
#include "stdio.h"int a[9]={1,2,3,4,5,6,7,8,9}; void police(int sum,int number,int oper[8],int index) //index是o?對?哪?一°?個?運?算?符¤?號? {int i=index-1; int lastOper;while(oper[i]==0 && i>=0)i--; lastOper=(i==-1)? 1:oper[i];if(index<8){oper[index]=0; int temp=number*10+a[index]; police(sum,temp,oper,index+1);int tempSum;if(lastOper==1) tempSum=sum+temp; if (lastOper==-1) tempSum=sum-temp;oper[index]=1; police(tempSum,0,oper,index+1);oper[index]=-1; police(tempSum,0,oper,index+1);}if(index==8){ if(lastOper==1) sum=sum+(number*10+a[index]);if(lastOper==-1) sum=sum-(number*10+a[index]);} if (index==8 && sum==110){for(int j=0;j<9;j++){printf("%d",a[j]);if(oper[j]==1 && j<8)printf("+");else if(oper[j]==-1 && j<8)printf("-");}printf("\n");} } void main() {int oper[8];oper[0]=0; police(0,1,oper,1); oper[0]=-1;police(1,0,oper,1);oper[0]=1; police(1,0,oper,1); }
總結
- 上一篇: CDO (Climate Data Op
- 下一篇: 在JSP中out.print()、out