匪警请拨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是º?对?哪?一°?个?运?算?符¤?号?
{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);	
}








本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部