题目描述
编程在算式123 45 67 8 9=N的下划线部分填上加号(+)或减号(-),使该等式成立。要求程序运行时输出该等式。(保证数据存在满足的等式)
输入要求
输入一个整数N。
输出要求
输出满足条件的等式。若不存在满足的等式,则输出"impossible"(输出不包括引号)
输入样例
100
输出样例
123+45-67+8-9=100
代码实现
这是之前的代码,图省事直接穷举了……我就说这个浏览量怎么和其他的不一样……真的献丑……后面有改进的版本。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if (n==123+45+67+8+9) printf("123+45+67+8+9=%d\n",n);
else if (n==123+45+67+8-9) printf("123+45+67+8-9=%d\n",n);
else if (n==123+45+67-8+9) printf("123+45+67-8+9=%d\n",n);
else if (n==123+45+67-8-9) printf("123+45+67-8-9=%d\n",n);
else if (n==123+45-67+8+9) printf("123+45-67+8+9=%d\n",n);
else if (n==123+45-67+8-9) printf("123+45-67+8-9=%d\n",n);
else if (n==123+45-67-8+9) printf("123+45-67-8+9=%d\n",n);
else if (n==123+45-67-8-9) printf("123+45-67-8-9=%d\n",n);
else if (n==123-45+67+8+9) printf("123-45+67+8+9=%d\n",n);
else if (n==123-45+67+8-9) printf("123-45+67+8-9=%d\n",n);
else if (n==123-45+67-8+9) printf("123-45+67-8+9=%d\n",n);
else if (n==123-45-67+8+9) printf("123-45-67+8+9=%d\n",n);
else if (n==123-45-67+8-9) printf("123-45-67+8-9=%d\n",n);
else if (n==123-45-67-8+9) printf("123-45-67-8+9=%d\n",n);
else if (n==123-45+67-8-9) printf("123-45+67-8-9=%d\n",n);
else if (n==123-45-67-8-9) printf("123-45-67-8-9=%d\n",n);
else printf("impossible\n");
return 0;
}
改良版
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int s1,s2,s3,s4,i,j,k,t,sum,flag;
char x1,x2,x3,x4; //输出字符
sum=0;
flag=0;
s1=-1;s2=-1;s3=-1;s4=-1; //计算时-1,+1来代替加减符号
scanf("%d",&n);
for(i=0;i<=1;i++) //四个循环,总共16个等式
{
s1=-s1; //使用!的话会变成逻辑值吧,代码sum的结果会发生改变
for(j=0;j<=1;j++)
{
s2=-s2;
for(k=0;k<=1;k++)
{
s3=-s3;
for(t=0;t<=1;t++)
{
s4=-s4;
sum=123+s1*45+s2*67+s3*8+s4*9; //计算等式的值和输入值进行比较
if(sum==n)
{ if(s1==1) x1='+';else x1='-';
if(s2==1) x2='+';else x2='-';
if(s3==1) x3='+';else x3='-';
if(s4==1) x4='+';else x4='-';//把-1,+1转化为字符输出
printf("123%c45%c67%c8%c9=%d\n",x1,x2,x3,x4,n);
flag=1; //如果可以有多个等式可以满足条件时的保险
}
}
}
}
}
if(!flag) printf("impossible\n"); //没有满足的等式输出不可能
return 0;
}