P1022 [NOIP2000 普及组] 计算器的改良

在这里插入图片描述

思路:

  1. .首先每个字符该如何进行读取,个人选择的读取方式是读一个处理一个,并没有创造字符串数组,也就是简单一个char c利用循环读取即可

  2. 每个字符读取后该如何处理。

  3. 创建一个int k0,kx来记录数字的总数和未知数的总数,然后最后相除即可出结果

  4. 如果读入的是数字,那么就定义一个s记录下每次读取的数字,由于读入的数字很可能大于10,那么用秦九韶方法记录,
    s = s*10 + c - ‘0’;但不需要加到k0中,等下次遇到加减号再进行加减

  5. 当遇到的字母的时候,这时候代表字母前面的数字已经记录在s里面了,这个时候只需要
    kx += s * deng * jiaj;
    在这里解释下,deng和jiaj是什么东西,deng用来记录当前是在等号前还是等号后,字符串在等号前,那么初始化deng =1,如果是在等号后面那么deng = -1,这样式子前后的符号就可以统一了。而jiaj是用来记录这个数字的符号是什么,如果前面是负号,那么jiaj会被置为-1,如果为正好,那么jiaj会被置为1,由于式子刚开始一般都是正的,那么jiaj初始化1.

  6. 当遇到符号为‘-’也就是负号时,这个时候重置jiaj,也就是jiaj = -1;然后将负号前面的数字进行相加,也就是
    k0 += s * deng *jiaj;

  7. 当遇到符号为‘+’也就是正号时,这个时候重置jiaj,也就是jiaj = 1;然后将正号前面的数字进行相加,也就是 k0 += s * deng *jiaj;

  8. 当遇到符号为等号的时候,c == ‘=’,这个时候到了式子的右边,那么就需要将deng = -1;并且将jiaj = 1然后将等号前面的数字进行相加,也就是 k0 += s * deng *jiaj;

  9. 注意一下,每次相加后都要将s重置为0,这样方便下一次的相加

  10. 还要注意一种情况,例如当x + x = 2的时候,x前面是没有数字的,那么就需要附加一个条件
    if(s == 0) s= 1;

建议代码和思路结合着看

代码:

#include<iostream>
using namespace std;
#include<cstring>
#include<iomanip>

int main()
{	
	int s = 0, deng = 1, jiaj = 1;
	char c, x;//x用于记录未知数
	int kx = 0, k0 = 0;
	//6a-5+a = 2-2a;
	while (cin >> c)
	{
		if (c >= 'a' && c <= 'z')
		{
			x = c;//用x记录下未知数
			if (s == 0)s = 1;
			kx += s * deng * jiaj;
			s = 0;
		}
		if (c >= '0' && c <= '9')
		{
			s = s * 10 + c - '0';//c - '0'可以将其转为数字
			//此语句用于记录数字
		}
		if (c == '=')// 当遇到等号的时候
		{
			//首先先把记录的数字先加上
			k0 += s * deng * jiaj;
			s = 0;
			deng = -1;
			jiaj = 1;
		}
		if (c == '-')
		{
			k0 += s * deng * jiaj;
			s = 0;
			jiaj = -1;
		}
		if (c == '+')
		{
			k0 += s * deng * jiaj;
			s = 0;
			jiaj = 1;
		}
	}
	k0 += s * deng * jiaj;
	cout << fixed << setprecision(3) << x << "=" << -1.0 * k0 / kx << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值