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

题面:https://www.luogu.org/problemnew/show/P1022


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

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

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

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[1010];
 4 int Left[1010],Right[1010];
 5 bool bjUKE[1010];
 6 int lens;
 7 char UKE=' ';
 8 int jc(int x,int y)//函数算10的幂次方
 9 {
10     int s=1;
11     for(int i=1;i<=y;i++)
12     {
13         s=s*10;
14     }
15     return s;
16 }
17 
18 int main()
19 {
20     //freopen("calc.in","r",stdin);
21     //freopen("calc.out","w",stdout); 
22     bool lbj=1;//用来判断是左边还是右边,左边为未知数的数量,右边为常数
23     int Rs=0,Ls=0;//Rs为右边的总和,Ls为左边的总和
24     while(cin>>s[++lens])//边输入边处理
25     {
26         if(s[lens]=='=')//如果遇到等号就换边
27         {
28             lbj=0;
29             continue;
30         }
31         else if(s[lens]>='a' && s[lens]<='z')//算左边的总和
32         {
33             if(UKE==' ') UKE=s[lens];
34             Left[0]++;
35             bjUKE[lens]=true;
36             if(s[lens-1]<='0' || s[lens-1]>='9')
37             {
38                 Left[Left[0]]++;
39             }
40             else
41             {
42                 for(int i=lens-1;i>=1;i--)
43                 {
44                     if(s[i]>='0' && s[i]<='9')
45                     {
46                         Left[Left[0]]+=int(s[i]-'0')*jc(10,lens-i-1);
47                         bjUKE[i]=true;
48                     }
49                     else
50                     {
51                         if((s[i]=='-' && lbj==1) || (s[i]!='-' && lbj==0))//依然是要变号!!!(坑2)
52                         {
53                             Left[Left[0]]=Left[Left[0]]*(-1);
54                         }
55                         break;
56                     }
57                 }
58             }
59             Ls=Ls+Left[Left[0]];
60         }
61     }
62     lbj=1;//判断重定义
63     for(int i=1;i<=lens;i++)//计算右边的常数总和
64     {
65         if((s[i]=='+' || s[i]<='-' ||  s[i]=='=') && bjUKE[i]==false && bjUKE[i-1]==false)
66         {
67             Right[0]++;
68             for(int j=i-1;j>=0;j--)
69             {
70                 if(s[j]>='0' && s[j]<='9')
71                 {
72                     Right[Right[0]]+=int(s[j]-'0')*jc(10,i-j-1);
73                 }
74                 else
75                 {
76                     if((s[j]=='-' && lbj==0) || (s[j]!='-' && lbj==1))//注意移项要变号!!!(坑2)
77                     {
78                         Right[Right[0]]=Right[Right[0]]*(-1);
79                     }
80                     break;
81                 }
82             }
83             Rs=Rs+Right[Right[0]];
84         }
85         if(s[i]=='=')
86         {
87             lbj=0;
88         }
89     }
90     if(Rs==0 || Ls==0) cout<<UKE<<"=0.000";//判读除数为零的情况,防止RE!!!(坑2)
91     else
92     {
93         cout<<UKE<<"=";
94         printf("%.3lf",double(Rs*1.000/Ls*1.000));
95     }
96     return 0;
97 } 

猜你喜欢

转载自www.cnblogs.com/wzztabaorz/p/10321327.html