算法1. 枚举:填写运算符

要求:将 +-*/ 四个运算符,填写到 5 5 5 5 5 = 5,使得等式成立

由于C语言中,没有 python.eval 这样的内置函数,必须自己实现字符串到计算公式的转换。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void) {
  int j, i[5], num[6];   // i=运算符,num=需要运算的5个数字
  int signal;         //累加运算时的符号
  int result;
  int count = 0;
  float left, right;      //保存中间结果
  char oper[5] = { ' ','+','-','*','/' };

  printf("input 5 numbers using black seperating: ");
  for (j = 1; j <= 5; j++) scanf("%d", &num[j]);
  printf("input result:");
  scanf("%d", &result);

  for (i[1] = 1; i[1] <= 4; i[1]++) {
    if (i[1] < 4 || num[2] != 0) {   // 等价于 !(i[j]==4 && num[j+1]==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];
                  signal = 1;
                  for (j = 1; j <= 4; j++) {
                    switch (oper[i[j]])
                    {
                    case '+':
                      left = left + signal * right;
                      signal = 1;
                      right = num[j + 1];
                      break;
                    case '-':
                      left = left + signal * right;
                      signal = -1;
                      right = num[j + 1];
                      break;
                    case '*':
                      right = right * num[j + 1];
                      break;
                    case '/':
                      right = right / num[j + 1];
                      break;
                    }
                  }
                  if (left + signal * right == result) {
                    count++;
                    printf("%3d: ", count);
                    for (j = 1; j <= 4; j++) printf("%d%c", num[j], oper[i[j]]);
                    printf("%d=%d\n", num[5], result);
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  if (count == 0) printf("没有符合要求的方法!\n");
  getchar(); return 0;
}

 

总结:

1.在每个位置枚举运算符,没什么好说的;

2.涉及除法运算时,必须保证被除数不能为0:(i[1] < 4 || num[2] != 0) 等价于 !(i[j]==4 && num[j+1]==0),这是一个逻辑等式

3.switch中,首先检查后面的运算符,如果是*/,直接运算;如果是+-,递推;

 

posted @ 2021-12-17 16:35  雅丽梅  阅读(61)  评论(0)    收藏  举报