穷举算法(填运算符)

例如:5 5 5 5 5 = 5,填入适当的运算符使等式相等,(1、当填入除号时,右侧的数不能为0;2、乘除的运算级别比加减高)

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main(){
 4     int j,i[5];//循环变量,用数组i保存4个运算符
 5     int count = 0;//计数器,统计符合条件的方案
 6     int sign;//累加运算时的符号
 7     int result;//保存运算式的结果
 8     int num[6];//保存操作数
 9     int right,left;//保存中间结果
10     char oper[5] = {' ','+','-','*','/'};
11     printf("请输入5个数:");
12     for(j = 1; j <= 5; j++)
13         scanf("%d",&num[j]);
14     printf("\n");
15     printf("请输入目标结果:");
16     scanf("%d",&result);
17     for( i[1] = 1; i[1] <= 4; i[1]++ ){//循环4个运算符,1->+,2->-,3->*,4->/ 
18         if(i[1] < 4 && num[2] != 0){//判断,如果是/,右边的数不能为0 
19             for(i[2] = 1; i[2] <= 4; i[2]++){
20                 if(i[2]<4 && num[3]!=0){
21                     for(i[3]=1;i[3]<=4;i[3]++){
22                         if(i[3]<4&&num[4]!=0){
23                             for(i[4]=1;i[4]<=4;i[4]++){
24                                 if(i[4]<4&&num[5]!=0){
25                                     left = 0;
26                                     right = num[1];
27                                     sign = 1;//加法 
28                                     for(j=1;j<=4;j++){
29                                         switch(oper[i[j]]){
30                                             case '+':
31                                                 left = left + sign*right;
32                                                 sign = 1;
33                                                 right = num[j+1];
34                                                 break;
35                                             case '-':
36                                                 left = left + sign*right;
37                                                 sign = -1;
38                                                 right = num[j+1];
39                                                 break;
40                                             case '*':
41                                                 right = right*num[j+1];
42                                                 break;
43                                             case '/':
44                                                 right = right/num[j+1];
45                                                 break;
46                                         }
47                                     }
48                                     if(left + sign*right == result){
49                                         count++;
50                                         printf("%3d: ",count);
51                                         for(j = 1; j <= 4; j++){
52                                             printf("%d%c",num[j],oper[i[j]]);
53                                         }
54                                         printf("%d=%d\n",num[5],result);
55                                     } 
56                                 }
57                             }
58                         }
59                     }
60                 }
61             }
62         }
63     }
64     if(count == 0)
65         printf("没有符合要求的方案");
66     //getch();
67     return 0; 
68 } 

posted @ 2018-11-05 09:44  无心小男  阅读(709)  评论(0编辑  收藏  举报