洛谷P1022 计算器的改良

在这里插入图片描述
这道题的基本思路就是用常熟和除以系数和解一元一次方程,所以我们只需算出所有的常数和以及所有的系数和就ok了,我们定义一个变量temp临时存放数字,当这个数字后面直接是运算符号(+或-或=)时,直接将数字存入常数和中,如果后面有字母,我们就将该数字存放到系数和之中去
贴下代码:

#include<bits/stdc++.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;

int temp = 0;
//正负默认为1为正 
int pre = 1;
//判断是在等号的左边还是右边 
int lor = 1;
//系数和常数都先默认为0 
double xi = 0;
double chang = 0;
double result;
char x;
int main(int argc, char** argv) {
	char c;
	while(scanf("%c",&c) != EOF){
		if(c >= '0' && c <= '9'){
			temp *= 10;
			temp += (c - '0')*pre*lor;
		}else if(c>='a' && c <= 'z' ){
			if(temp == 0){
				temp = 1 * pre * lor;
			}
				//直接把系数保存起来 
			xi += temp*(-1);				
			//将变量保存下来,方便最后打印结果 
			x = c;
			temp = 0;
		}else if(c == '-'){
			//遇到符号,把常数和加起来,因为未知数前面的数已经处理过了,所以只需要处理常数就好 
			chang += temp;
			temp = 0;
			pre = -1;
		}else if(c == '+'){
			chang += temp;
			temp = 0;
			pre = 1;
		}else if(c == '='){
			chang += temp;
			temp = 0;
			pre = 1;
			lor = -1;
		}
	}
	//如果最后一个数为常数,那么下一次读入eof会使得这次的常数并没用加入到常数总数中,所以在这里要进行一次处理 
	if(temp != 0){
		chang += temp;
	}
	result = chang/xi == 0?abs(chang/xi):chang/xi;
	printf("%c=%.3f",x,result);
	
	return 0;
}

这里要注意两个细节
1.如果算出来的数字是0的话,直接打印出来的是-0,所以我们要判断一下
2.如果方程的最后一项为常数,因为下一位是eof,所以按照我们的程序这个常数不会存入到常数和中,所以我们要在跳出while之后进行判断,如果temp还没有清零,则说明最后一项为常数,我们就要把它加入到常数和之中

除此之外,还要注意变量的数据类型,因为我们最后算出来的数字要保留三位小数,所以这个结果要用double(比float保险一些),而常数和系数和虽然不会出现小数,但是为了计算,还是用double比较好,因为我试了强转类型没成功…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值