枚举小结

来源:互联网 发布:校园网络海报 编辑:程序博客网 时间:2024/06/06 09:11

一想到枚举,就是暴力,近日在看算法书,感觉厘清思想比较重要,所以来写下一点自己的感想。

例题:

a  b  c  d  e  = f  (a~f为0~9))  添加+、-、*、/ 号来使得等式成立。

分析该式子,由5个数构成的算式,一共需要填入4个运算符,注意点:

1、除法分母不为0 

2、乘除法运算级别优先于加减法

思路: 两个变量 left 和 right 分别保存上次运算结果(下次运算的左侧内容)和下次参加运算的数据(下次运算的右侧内容)

           比如 5 + 5 - 5 * 5 / 5 = 5,left = 5 + 5   right = 5 * 5 / 5

#include <cstdio>#include <cstring> char op[5]={' ','+','-','*','/'};int num[10];int main(){int i[5],j,temp,result,ans=0;printf("请输入5个数:");for(j=1;j<=5;j++)  scanf("%d",&num[j]);    printf("请输入结果:");    scanf("%d",&result);    double left,right;    for(i[1]=1;i[1]<=4;i[1]++) //循环四种运算符,1表示 +,2表示 —,3表示 *,4表示 / {      if(i[1]<4 || num[2]!=0){   for(i[2]=1;i[2]<=4;i[2]++)   {         if(i[2]<4 || num[3]!=0)          { for(i[3]=1;i[3]<=4;i[3]++) { if(i[3]<4 || num[4]!=0) { for(i[4]=1;i[4]<=4;i[4]++) { if(i[4]<4 || num[5]!=0) { left=0; right=num[1]; temp=1; for(j=1;j<=4;j++) { switch(op[i[j]]) { case '+':      left=left+temp*right;      temp=1;      right=num[j+1];      break;                case'-':                     left=left+temp*right;                     temp=-1;                     right=num[j+1];                     break;                                    case'*':                     right=right*num[j+1];                     break;                                    case'/':                     right=right/num[j+1];                     break; } } if(left+temp*right==result) { ans++; printf("%3d: ",ans); for(j=1;j<=4;j++) { printf("%d%c",num[j],op[i[j]]); } printf("%d=%d\n",num[5],result); } } } }    }      }      }}}     if(ans==0)printf("没有符合要求的方法\n");return 0; }



0 0
原创粉丝点击