给一个初始操作数a,然后对这个操作数执行n次加减乘余的计算操作【每次操作a自增1,而且不考虑运算符优先级,谁在前面先算谁】,最后会得到一个结果数x,问如何求出这些操作符??
重要:程序不能使用递归,最好只用一个主函数!!
比如,给你一个初始数3,执行7次加减乘余操作,最后得到结果147,那么有一种操作符序列满足条件:* + + - * + +
既:3*4+5+6-7*8+9+10=147
亲测合格,请验证:
#include
#include
using namespace std;
int num, opera_num, result;
char opera[100];
void main()
{
int i,j=0, max = 4, right_max=1, right_extent, model=3, model_temp,test_num;
cout << "请输入操作数" << endl;
cin >> num ;
cout << "请输入操作符个数" << endl;
cin >> opera_num;
cout << "请输入最后结果数" << endl;
cin >> result;
for (i = 1; i < opera_num; i++)
{
max *= 4;
model *= 4;
right_max *= 4;
}
for (i = 0; i < max; i++)
{
test_num = num;
right_extent = right_max;
for (model_temp = model; model_temp > 0; model_temp /= 4)
{
switch ((i&model_temp) / right_extent)
{
case 0:
opera[j] = '+';
test_num = test_num + (++num);
break;
case 1:
opera[j] = '-';
test_num = test_num - (++num);
break;
case 2:
opera[j] = '*';
test_num = test_num * (++num);
break;
case 3:
opera[j] = '%';
test_num = test_num % (++num);
break;
}
right_extent /= 4;
j++;
}
num -= opera_num;
j = 0;
if (test_num == result) goto end;
}
printf("没有符合结果的预测,请检查输入!");
system("pause");
end:
printf("这种公式符合结果数:%d ", num);
for (i = 0; i < opera_num; i++) printf("%c %d ", opera[i], ++num);
system("pause");
}
可以用动态规划算法。
不考虑效率的话,直接遍历就最简单了,毕竟条件都是定的
题目描述还是不够清晰啊,比如说3到147,执行7次操作到147,运算符太多啦