zoukankan      html  css  js  c++  java
  • 穷举算法(填运算符)

    例如: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("
    ");
    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
    ",num[5],result);
    55                                     } 
    56                                 }
    57                             }
    58                         }
    59                     }
    60                 }
    61             }
    62         }
    63     }
    64     if(count == 0)
    65         printf("没有符合要求的方案");
    66     //getch();
    67     return 0; 
    68 } 

  • 相关阅读:
    Codeforces610b
    Codeforces597A
    Timus1014(贪心算法)
    一般贪心
    优先队列问题(此题来源哈尔滨理工大学VJ)
    POJ2551Dungeon Master
    LightOJ 1140: How Many Zeroes? (数位DP)
    HDU 2089:不要62(数位DP)
    HDU 4722:Good Numbers(数位DP)
    HDU 3709: Balanced Number (数位DP)
  • 原文地址:https://www.cnblogs.com/geziyu/p/9907498.html
Copyright © 2011-2022 走看看