(2000年普及组)计算器的改良QAQ

此题太坑,好多好多的坑,具体请看代码吧。

本来在本地的lemon上测没过,但在luogu上测A了。

好了xs完了,于是上代码。

#include<bits/stdc++.h>
using namespace std;
char s[1010];
int Left[1010],Right[1010];
bool bjUKE[1010];
int lens;
char UKE=' ';
int jc(int x,int y)//函数算10的幂次方
{
    int s=1;
    for(int i=1;i<=y;i++)
    {
        s=s*10;
    }
    return s;
}

int main()
{
    //freopen("calc.in","r",stdin);
    //freopen("calc.out","w",stdout); 
    bool lbj=1;//用来判断是左边还是右边,左边为未知数的数量,右边为常数
    int Rs=0,Ls=0;//Rs为右边的总和,Ls为左边的总和
    while(cin>>s[++lens])//边输入边处理
    {
        if(s[lens]=='=')//如果遇到等号就换边
        {
            lbj=0;
            continue;
        }
        else if(s[lens]>='a' && s[lens]<='z')//算左边的总和
        {
            if(UKE==' ') UKE=s[lens];
            Left[0]++;
            bjUKE[lens]=true;
            if(s[lens-1]<='0' || s[lens-1]>='9')
            {
                Left[Left[0]]++;
            }
            else
            {
                for(int i=lens-1;i>=1;i--)
                {
                    if(s[i]>='0' && s[i]<='9')
                    {
                        Left[Left[0]]+=int(s[i]-'0')*jc(10,lens-i-1);
                        bjUKE[i]=true;
                    }
                    else
                    {
                        if((s[i]=='-' && lbj==1) || (s[i]!='-' && lbj==0))//依然是要变号!!!(坑2)
                        {
                            Left[Left[0]]=Left[Left[0]]*(-1);
                        }
                        break;
                    }
                }
            }
            Ls=Ls+Left[Left[0]];
        }
    }
    lbj=1;//判断重定义
    for(int i=1;i<=lens;i++)//计算右边的常数总和
    {
        if((s[i]=='+' || s[i]<='-' ||  s[i]=='=') && bjUKE[i]==false && bjUKE[i-1]==false)
        {
            Right[0]++;
            for(int j=i-1;j>=0;j--)
            {
                if(s[j]>='0' && s[j]<='9')
                {
                    Right[Right[0]]+=int(s[j]-'0')*jc(10,i-j-1);
                }
                else
                {
                    if((s[j]=='-' && lbj==0) || (s[j]!='-' && lbj==1))//注意移项要变号!!!(坑2)
                    {
                        Right[Right[0]]=Right[Right[0]]*(-1);
                    }
                    break;
                }
            }
            Rs=Rs+Right[Right[0]];
        }
        if(s[i]=='=')
        {
            lbj=0;
        }
    }
    if(Rs==0 || Ls==0) cout<<UKE<<"=0.000";//判读除数为零的情况,防止RE!!!(坑2)
    else
    {
        cout<<UKE<<"=";
        printf("%.3lf",double(Rs*1.000/Ls*1.000));
    }
    return 0;
}

转载于:https://www.cnblogs.com/wzztabaorz/articles/10492263.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值