算法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中,首先检查后面的运算符,如果是*/,直接运算;如果是+-,递推;