P1022 计算器的改良

文章目录

题目

洛谷 P1022

思路

我们自己是如何解一元一次方程的?
移项、合并同类项之后,将方程化为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;
}
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值