題目
字串處理
有個地方不知道為什麼那樣會wa,詳見注釋。
另外我採用的是一行讀入,然後進行字串parse,比較麻煩。
可以採用istringstream或sscanf等,從字串再進行格式化讀入,比較好。參考:http://www.cnblogs.com/shixuehunk/archive/2011/07/22/2113728.html
、 http://www.cppblog.com/rakerichard/archive/2011/04/07/143608.html
代碼:
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<iomanip>using namespace std;double P, I, U;double cal(int p, int i, int u){ if(!u) return P/I; else if(!p) return U*I; else if(!i) return P/U;}double s2d(string s){ double ret = 0.0; int ispre = 0; int isdot = 0; int dot = 1; for(int i=0; i<(int)s.length(); i++) { if(s[i]=='m' || s[i]=='k' || s[i]=='M') { ispre=1; break; } if(s[i] == '.') { isdot = 1; continue; } if(isdot) dot*=10; ret = ret*10+s[i]-'0'; } ret/=(double)dot; if(ispre) { switch(s[s.length()-1]) { case 'm': ret/=1000; break; case 'k': ret*=1000; break; case 'M': ret*=1000000; break; } } return ret;}int isp, isi, isu;double solve(string s){ isp=0, isi=0, isu=0; int p1 = s.find("U=", 0); int p2 = s.find("I=", 0); int p3 = s.find("P=", 0); if(p1 != -1) { isu = 1; int p = s.find('V', p1); string t = s.substr(p1+2, p-p1-2); U = s2d(t); } if(p2 != -1) { isi = 1; int p = s.find('A', p2); string t = s.substr(p2+2, p-p2-2); I = s2d(t); } if(p3 != -1) { isp = 1; int p = s.find('W', p3); string t = s.substr(p3+2, p-p3-2); P = s2d(t); } return cal(isp, isi, isu);}int main(){ int t; cin>>t; cin.get(); for(int i=1; i<=t; i++) { string s; getline(cin, s); cout<<"Problem #"<<i<<endl; /* 用cout,直接輸出函數傳回值,WA if(!isp) cout<<"P"; else if(!isi) cout<<"I"; else if(!isu) cout<<"U"; cout<<"="<<setiosflags(ios::fixed)<<setprecision(2)<<solve(s); if(!isp) cout<<"W"; else if(!isi) cout<<"A"; else if(!isu) cout<<"V"; cout<<endl; cout<<endl; */ // 用cout,先把函數傳回值賦給ans,再輸出ans,AC double ans = solve(s); if(!isp) cout<<"P"; else if(!isi) cout<<"I"; else if(!isu) cout<<"U"; cout.setf(ios::fixed); cout.precision(2); cout<<"="<<ans; if(!isp) cout<<"W"; else if(!isi) cout<<"A"; else if(!isu) cout<<"V"; cout<<endl; cout<<endl; /* 用 printf AC。 double ans = solve(s); if(!isp) printf("P=%.2fW\n", ans); else if(!isi) printf("I=%.2fA\n", ans); else if(!isu) printf("U=%.2fV\n", ans); printf("\n"); */ }}