欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷P1022 计算器的改良

程序员文章站 2022-04-07 09:04:54
...

洛谷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比较好,因为我试了强转类型没成功…