洛谷P1022 计算器的改良
程序员文章站
2022-04-07 09:04:54
...
这道题的基本思路就是用常熟和除以系数和解一元一次方程,所以我们只需算出所有的常数和以及所有的系数和就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比较好,因为我试了强转类型没成功…
上一篇: python刷投票的脚本实现代码
下一篇: 实例详解vue复合组件实现注册表单功能