题面: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 }