1. 程式人生 > >洛谷P1022計算器的改良(字符串+各種細節坑點考慮)

洛谷P1022計算器的改良(字符串+各種細節坑點考慮)

思路 with 運算 sync ret 題意 bsp lag style

題目鏈接:https://www.luogu.org/problemnew/show/P1022

分析和思路:

題意好理解,就是字符串處理+方程求解,但是真的有很多坑點要考慮到

  1 #include <iostream>
  2 #include <string>
  3 #include <algorithm>
  4 #include <iomanip>
  5 #include <vector>
  6 #include <map>
  7 #include <set>
  8 #include <stack>
  9
#include <queue> 10 #include <cstdio> 11 #include <cstring> 12 #include <cmath> 13 using namespace std; 14 typedef long long ll; 15 typedef unsigned long long ull; 16 const int maxn=1005; 17 int vis[maxn]; 18 string s,s1,s2; 19 20 int main() 21 { 22 ios::sync_with_stdio(false
); cin.tie(0); 23 24 //輸入 25 cin>>s; 26 27 //準備工作 28 int len=s.length(); 29 for(int i=0;i<=len-1;i++) 30 { 31 if(s[i]===) 32 { 33 string st=s.substr(0,i); 34 s1=st; 35 string stt=s.substr(i+1,len-i);
36 s2=stt; 37 break; 38 } 39 } 40 int len1=s1.length(); 41 42 //計算a串 43 int x=0,y=0;//系數項,常數項 44 int pre=0,pref=0;//前一個字符標號 45 for(int i=0;i<=len1-1;i++) 46 { 47 if(s1[i]==+)//正數 48 { 49 if(s1[i-1]>=a && s1[i-1]<=z)//系數項 50 { 51 if(s1[i-1-1]!=+ && s1[i-1-1]!=- && i-1-1>=0)//坑點:2x和x區別,系數不為1,a 52 { 53 int t=0; 54 for(int j=pre;j<=i-1-1;j++) 55 { 56 int tt=s1[j]-0; 57 t=t*10+tt; 58 } 59 60 if(pref==0) x=x+t; 61 else if(pref==1) x=x-t; 62 } 63 else//系數為1,a 64 { 65 if(pref==0) x=x+1; 66 else if(pref==1) x=x-1; 67 } 68 } 69 else//常數項 70 { 71 int t=0; 72 for(int j=pre;j<=i-1;j++) 73 { 74 int tt=s1[j]-0; 75 t=t*10+tt; 76 } 77 //cout<<t<<endl; 78 if(pref==0) y=y+t; 79 else if(pref==1) y=y-t; 80 } 81 82 pre=i+1; 83 pref=0; 84 } 85 else if(s1[i]==-)//負數 86 { 87 if(s1[i-1]>=a && s1[i-1]<=z)//系數項 88 { 89 if(s1[i-1-1]!=+ && s1[i-1-1]!=- && i-1-1>=0) 90 { 91 int t=0; 92 for(int j=pre;j<=i-1-1;j++) 93 { 94 int tt=s1[j]-0; 95 t=t*10+tt; 96 } 97 if(pref==0) x=x+t; 98 else if(pref==1) x=x-t; 99 } 100 else 101 { 102 if(pref==0) x=x+1; 103 else if(pref==1) x=x-1; 104 } 105 } 106 else//常數項 107 { 108 int t=0; 109 for(int j=pre;j<=i-1;j++) 110 { 111 int tt=s1[j]-0; 112 t=t*10+tt; 113 } 114 if(pref==0) y=y+t; 115 else if(pref==1) y=y-t; 116 } 117 118 pre=i+1; 119 pref=1; 120 } 121 else if(i==len1-1)//末尾 122 { 123 if(s1[i]>=a && s1[i]<=z)//系數項 124 { 125 if(s1[i-1]!=+ && s1[i-1]!=- && i-1-1>=0) 126 { 127 int t=0; 128 for(int j=pre;j<=i-1;j++) 129 { 130 int tt=s1[j]-0; 131 t=t*10+tt; 132 } 133 if(pref==0) x=x+t; 134 else if(pref==1) x=x-t; 135 } 136 else 137 { 138 if(pref==0) x=x+1; 139 else if(pref==1) x=x-1; 140 } 141 } 142 else//常數項 143 { 144 int t=0; 145 for(int j=pre;j<=i;j++) 146 { 147 int tt=s1[j]-0; 148 t=t*10+tt; 149 } 150 if(pref==0) y=y+t; 151 else if(pref==1) y=y-t; 152 } 153 154 pre=i+1; 155 pref=0;//末尾了怎麽都行 156 } 157 } 158 159 //計算b串 160 int xx=x,yy=y; 161 x=0,y=0; 162 pre=0,pref=0; 163 s1=s2,len1=s1.length(); 164 for(int i=0;i<=len1-1;i++) 165 { 166 if(s1[i]==+)//正數 167 { 168 if(s1[i-1]>=a && s1[i-1]<=z)//系數項 169 { 170 if(s1[i-1-1]!=+ && s1[i-1-1]!=- && i-1-1>=0)//系數不為1,a 171 { 172 int t=0; 173 for(int j=pre;j<=i-1-1;j++) 174 { 175 int tt=s1[j]-0; 176 t=t*10+tt; 177 } 178 179 if(pref==0) x=x+t; 180 else if(pref==1) x=x-t; 181 } 182 else//系數為1,a 183 { 184 if(pref==0) x=x+1; 185 else if(pref==1) x=x-1; 186 } 187 } 188 else//常數項 189 { 190 int t=0; 191 for(int j=pre;j<=i-1;j++) 192 { 193 int tt=s1[j]-0; 194 t=t*10+tt; 195 } 196 if(pref==0) y=y+t; 197 else if(pref==1) y=y-t; 198 } 199 200 pre=i+1; 201 pref=0; 202 } 203 else if(s1[i]==-)//負數 204 { 205 if(s1[i-1]>=a && s1[i-1]<=z)//系數項 206 { 207 if(s1[i-1-1]!=+ && s1[i-1-1]!=- && i-1-1>=0) 208 { 209 int t=0; 210 for(int j=pre;j<=i-1-1;j++) 211 { 212 int tt=s1[j]-0; 213 t=t*10+tt; 214 } 215 if(pref==0) x=x+t; 216 else if(pref==1) x=x-t; 217 } 218 else 219 { 220 if(pref==0) x=x+1; 221 else if(pref==1) x=x-1; 222 } 223 } 224 else//常數項 225 { 226 int t=0; 227 for(int j=pre;j<=i-1;j++) 228 { 229 int tt=s1[j]-0; 230 t=t*10+tt; 231 } 232 if(pref==0) y=y+t; 233 else if(pref==1) y=y-t; 234 } 235 236 pre=i+1; 237 pref=1; 238 } 239 else if(i==len1-1)//末尾 240 { 241 if(s1[i]>=a && s1[i]<=z)//系數項 242 { 243 if(s1[i-1]!=+ && s1[i-1]!=- && i-1-1>=0) 244 { 245 int t=0; 246 for(int j=pre;j<=i-1;j++) 247 { 248 int tt=s1[j]-0; 249 t=t*10+tt; 250 } 251 if(pref==0) x=x+t; 252 else if(pref==1) x=x-t; 253 } 254 else 255 { 256 if(pref==0) x=x+1; 257 else if(pref==1) x=x-1; 258 } 259 } 260 else//常數項 261 { 262 int t=0; 263 for(int j=pre;j<=i;j++) 264 { 265 int tt=s1[j]-0; 266 t=t*10+tt; 267 } 268 if(pref==0) y=y+t; 269 else if(pref==1) y=y-t; 270 } 271 272 pre=i+1; 273 pref=0;//末尾了怎麽都行 274 } 275 } 276 277 //計算答案+輸出 278 xx=xx-x; 279 yy=yy-y; 280 yy*=-1; 281 for(int i=0;i<=len-1;i++) 282 { 283 if(s[i]>=a && s[i]<=z) 284 { 285 cout<<s[i]; 286 break; 287 } 288 } 289 cout<<"="; 290 if(yy==0) 291 { 292 cout<<"0.000"<<endl;//坑點:c運算機制,0/負數輸出-0,所以需要特判!! 293 } 294 else 295 { 296 double ans=yy*1.0/xx; 297 cout<<setiosflags(ios::fixed)<<setprecision(3)<<ans<<endl; 298 } 299 300 return 0; 301 }

完。

洛谷P1022計算器的改良(字符串+各種細節坑點考慮)