洛谷 P1022 计算器的改良

题解:字符串模拟

坑点:

1) 0/-1=-0.

这是因为(来自洛谷讨论区某大犇)

double下存储的数字会有精度误差,比如0可能被存成0.000000000...01
然而如果你乘上或者除以一个负数,可能就变成了-0.000000000...01
然后因为浮点数是先判定符号再计算数值,就出现了负0这一情况

 2)我遇到的就这一个....

具体做法是以-,+,=为分界,分别累加字母的系数和实数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int now,len,f,c,a,b;

string s;        //6a-5+1=2-2a;

char ans;

int main(){
    ios::sync_with_stdio(false);
    cin>>s;len=s.length();f=1;s[len]='+';len++;
    while(1){                 
        if(s[now]>='a'&&s[now]<='z'){
            a=a+f*(c==0?1:c);ans=s[now];
            f=1; c=0; now++;
            continue; 
        }
        if(s[now]=='-'){
            b=b+f*c;
            f=-1;c=0;now++;
            continue; 
        }
        if(s[now]=='+'){
            b=b+f*c;
            f=1;c=0;now++;
            continue;
        }
        if(s[now]>='0'&&s[now]<='9'){
            c=c*10+s[now]-'0';
            now++;
            continue;
        }
        if(s[now]=='='){
            b=b+f*c;
            break;
        }
    }

    b=b*-1;now++;c=0;f=1;    
    while(now<len){
        if(s[now]>='a'&&s[now]<='z'){
            a=a-f*(c==0?1:c);ans=s[now];
            f=1;c=0;now++;
            continue;
        }
        if(s[now]=='-'){
            b=b+f*c;
            f=-1;c=0;now++;
            continue;
        }
        if(s[now]=='+'){
            b=b+f*c;
            f=1;c=0; now++;
            continue;
        }
        if(s[now]>='0'&&s[now]<='9'){
            c=c*10+s[now]-'0';
            now++;
            continue;    
        }
    }
    if(b==0)printf("0.000\n");
    else 
    printf("%c=%.3f\n",ans,b*1./a);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zzyh/p/9424422.html