穷举算法(填运算符)
例如: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 }