输入一个210之间的正整数,假设输入值为10,则在4个10即如下: 10 10 10 10 之间或之前,任意插入数学运算符:+(加) 、 -(减) 、 *(乘) 、 /(除)、-(负号)、!(阶乘)、√(开平方,即平方根)使得整个式子的值为110。即:假设输入的值为10,则:
10 10 10 10 = 1
10 10 10 10 = 2
10 10 10 10 = 3
10 10 10 10 = 4
10 10 10 10 = 5
10 10 10 10 = 6
10 10 10 10 = 7
10 10 10 10 = 8
10 10 10 10 = 9
10 10 10 10 = 10 只要每一个式子给出一个式子即可。若不存在,则输出该式子无法给成。
给你写了个:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
char op[5] = { '#', '+', '-', '*', '/', };
int n;
float cal(float x, float y, int op)
{
switch (op) //将运算符初始化为1,2,3,4四个数字
{
case 1:return x + y;
case 2:return x - y;
case 3:return x*y;
case 4:return x / y;
}
}
//对应表达式((AoB)oC)oD
float m1(float i, float j, float k, float t, int op1, int op2, int op3)
{
float r1, r2, r3;
r1 = cal(i, j, op1);
r2 = cal(r1, k, op2);
r3 = cal(r2, t, op3);
return r3;
}
//对应表达式(Ao(BoC))oD
float m2(float i, float j, float k, float t, int op1, int op2, int op3)
{
float r1, r2, r3;
r1 = cal(j, k, op2);
r2 = cal(i, r1, op1);
r3 = cal(r2, t, op3);
return r3;
}
//对应表达式Ao(Bo(CoD))
float m3(float i, float j, float k, float t, int op1, int op2, int op3)
{
float r1, r2, r3;
r1 = cal(k, t, op3);
r2 = cal(j, r1, op2);
r3 = cal(i, r2, op1);
return r3;
}
//对应表达式Ao((BoC)oD)
float m4(float i, float j, float k, float t, int op1, int op2, int op3)
{
float r1, r2, r3;
r1 = cal(j, k, op2);
r2 = cal(r1, t, op3);
r3 = cal(i, r2, op1);
return r3;
}
//对应表达式(AoB)o(CoD)
float m5(float i, float j, float k, float t, int op1, int op2, int op3)
{
float r1, r2, r3;
r1 = cal(i, j, op1);
r2 = cal(k, t, op3);
r3 = cal(r1, r2, op2);
return r3;
}
int get(int i, int j, int k, int t,int n)
{
int op1, op2, op3;
int flag = 0;
for (op1 = 1; op1 <= 4; op1++){ //通过一个三重循坏列举了符号的变化情况
for (op2 = 1; op2 <= 4; op2++){
for (op3 = 1; op3 <= 4; op3++){
if (m1(i, j, k, t, op1, op2, op3) == n)
{
printf("((%d%c%d)%c%d)%c%d=%d\n", i, op[op1], j, op[op2], k, op[op3], t,n);
flag = 1;
break;
}
if (m2(i, j, k, t, op1, op2, op3) == n)
{
printf("(%d%c(%d%c%d))%c%d=%d\n", i, op[op1], j, op[op2], k, op[op3], t,n);
flag = 1;
break;
}
if (m3(i, j, k, t, op1, op2, op3) == n)
{
printf("%d%c(%d%c(%d%c%d))=%d\n", i, op[op1], j, op[op2], k, op[op3], t,n);
flag = 1;
break;
}
if (m4(i, j, k, t, op1, op2, op3) == n)
{
printf("%d%c((%d%c%d)%c%d)=%d\n", i, op[op1], j, op[op2], k, op[op3], t,n);
flag = 1;
break;
}
if (m5(i, j, k, t, op1, op2, op3) == n)
{
printf("(%d%c%d)%c(%d%c%d)=%d\n", i, op[op1], j, op[op2], k, op[op3], t,n);
flag = 1;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
return flag;
}
int main()
{
int i, j, k, t,x;
scanf("%d",&n);
i =j=k=t=n;
for(x=1;x<=n;x++){
get(i, j, k, t,x);
}
return 0;
}
用穷举法把所有式子都试一遍
利用栈的在计算机中的存储结构,穷举。