题目
思路
我们自己是如何解一元一次方程的?
移项、合并同类项之后,将方程化为ax=b的形式,解得x=b/a
所以我们的任务就是计算未知数的系数和、计算数字项的和
因为方程是以字符串的形式给出的,所以我们要能区别开这个数字是未知数的系数,还是数字项。并且要能够判断出一个完整的数字在哪里开始、在哪里结束,以及数字的正负。
将字符分为4类:
1、数字:直接提取出来
2、’+’ ‘-’ : 他们是一个完整数字的结束,同时又标志着下一个数字的开始以及下一个数字的符号。所以如果到了加号减号这里,要进行两件事:
- 把上一个数字累加。此时就需要判断这个数字是未知数的系数还是数字项。这个容易判断,符号前面如果是字母,就是未知数系数;符号前面如果是数字,就是数字项。
- 标记下一个数字的符号
3、‘=’:
- 与‘+’‘-’有同样的作用
- 移项变号的标记 。为了更方便我们将方程化为ax+b=0的形式,那么在‘=’右边的数字就要变号。
4、字母:也就是未知数。告诉我们未知数是用哪个字母表示的
有可能会存在字母前面的1忽略不写的情况,所以我们需要判断这个字母前面有没有系数,如果没有系数,则系数为1
注意:
- 0除以一个数经常会输出-0.000,手动加一个eps即可
- 因为此思路数字的累加是在 + - = 处进行的,字符串的最后一个数字的后面是没有这三个符号的,所以在字符串的最后再加一个符号即可
代码
#include<stdio.h>
#include<string.h>
double eps=1e-8;
int main()
{
char s[101],c;
scanf("%s",s);
int len=strlen(s);//字符串长度
int i,m,a=0,b=0,f=1,now=0;
//a未知项系数和 b数字项的和 f正负号标记 now提取的数字
s[len]='+';//看思路中的注意2
for(i=0;i<len;++i) //寻找=的位置
if(s[i]=='=')
{
m=i;
break;
}
for(i=0;i<=len;++i)
if(s[i]>='0' && s[i]<='9') now=now*10+s[i]-'0'; //数字
else if(s[i]=='+' || s[i]=='-' || s[i]=='=') //符号
{
if(s[i-1]>='0' && s[i-1]<='9') b+=now*f; //数字项
else a+=now*f;//未知数系数
now=0; //为下一个数字清领
if(i<m) f= s[i]=='+' ? 1 : -1; //根据=的左右判断是否变号
else f= s[i]=='-' ? 1 : -1;
}
else //字母
{
c=s[i];
if(!i || !(s[i-1]>='0' && s[i-1]<='9')) now=1; //被忽略的系数1
}
double x=-1.0*b/a;
printf("%c=%.3lf",c,x+eps);
return 0;
}