嗯這道題看題目好牛B的樣子,實際上就是簡單的字符串處理啦
首先是要讀出一共有多少行
再對每一行進行處理,提取出U,I,P三項中的兩項,計算第三項,代碼比較簡單也很好理解,貼在下面
#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
int n = 0;
string s;
getline(cin,s);
int len = s.length();
for (int t = 0; t < len; t ++){
n = n*10+s[t]-'0';
}
int m = n;
int j,k,mi;
double p,u,i;
while ( getline(cin,s) ){
p = 0, u = 0, i = 0;
j = s.find('=');
if (s[j-1]=='P'){
j ++;
while( s[j]>='0' && s[j]<='9' ){
p = p*10+s[j]-'0';
j ++;
}
if (s[j]=='.') {j ++; mi = 1;}
while( s[j]>='0' && s[j]<='9' ){
p = p+(s[j]-'0')/pow(double(10),mi);
j ++;
mi ++;
}
if (s[j]=='m') p = p/1000;
else if (s[j]=='k') p = p*1000;
else if (s[j]=='M') p = p*1000000;
}
if (s[j-1]=='U'){
j ++;
while( s[j]>='0' && s[j]<='9' ){
u = u*10+s[j]-'0';
j ++;
}
if (s[j]=='.') {j ++; mi = 1;}
while( s[j]>='0' && s[j]<='9' ){
u = u+(s[j]-'0')/pow(double(10),mi);
j ++;
mi ++;
}
if (s[j]=='m') u = u/1000;
else if (s[j]=='k') u = u*1000;
else if (s[j]=='M') u = u*1000000;
}
if (s[j-1]=='I'){
j ++;
while( s[j]>='0' && s[j]<='9' ){
i = i*10+s[j]-'0';
j ++;
}
if (s[j]=='.') {j ++; mi = 1;}
while( s[j]>='0' && s[j]<='9' ){
i = i+(s[j]-'0')/pow(double(10),mi);
j ++;
mi ++;
}
if (s[j]=='m') i = i/1000;
else if (s[j]=='k') i = i*1000;
else if (s[j]=='M') i = i*1000000;
}
k = s.find('=',j);
if (s[k-1]=='P'){
k ++;
while( s[k]>='0' && s[k]<='9' ){
p = p*10+s[k]-'0';
k ++;
}
if (s[k]=='.') {k ++; mi = 1;}
while( s[k]>='0' && s[k]<='9' ){
p = p+(s[k]-'0')/pow(double(10),mi);
k ++;
mi ++;
}
if (s[k]=='m') p = p/1000;
else if (s[k]=='k') p = p*1000;
else if (s[k]=='M') p = p*1000000;
}
if (s[k-1]=='U'){
k ++;
while( s[k]>='0' && s[k]<='9' ){
u = u*10+s[k]-'0';
k ++;
}
if (s[k]=='.') {k ++; mi = 1;}
while( s[k]>='0' && s[k]<='9' ){
u = u+(s[k]-'0')/pow(double(10),mi);
k ++;
mi ++;
}
if (s[k]=='m') u = u/1000;
else if (s[k]=='k') u = u*1000;
else if (s[k]=='M') u = u*1000000;
}
if (s[k-1]=='I'){
k ++;
while( s[k]>='0' && s[k]<='9' ){
i = i*10+s[k]-'0';
k ++;
}
if (s[k]=='.') {k ++; mi = 1;}
while( s[k]>='0' && s[k]<='9' ){
i = i+(s[k]-'0')/pow(double(10),mi);
k ++;
mi ++;
}
if (s[k]=='m') i = i/1000;
else if (s[k]=='k') i = i*1000;
else if (s[k]=='M') i = i*1000000;
}
cout << "Problem #" << m-n+1 << endl;
if (p==0) { p = u*i; cout << "P=" << setprecision(2) << std::fixed << p << "W" << endl << endl;}
else if (u==0) { u = p/i; cout << "U=" << setprecision(2) << std::fixed << u << "V" << endl << endl;}
else if (i==0) { i = p/u; cout << "I=" << setprecision(2) << std::fixed << i << "A" << endl << endl;}
n--;
if (n==0) break;
}
return 0;
}
需要注意的地方如下:
1.因爲每一行都可能存在空格,如果用cin讀取的話碰到空格就直接跳了,會產生錯誤的結果,因此採用getline()函數
2.如果cin行數之後再getline()每一行的話,第一行是讀不出來的,具體的原因我不太清楚,哪位大牛知道請告訴我,十分感謝
個人感覺是cin之後的回車是被getline()讀取了的,所以這一行就相當於被讀了,所以第一行不能getline()但是後面的都可以
我的解決辦法是把行數也getline()讀,這樣處理起來就很統一
3.還有個細節是保留兩位小數 cout << "P=" << setprecision(2) << std::fixed << p << "W" 這樣就可以了
4.提取字符的時候可以做成一個函數,可以簡短代碼的長度,增加可讀性,嗯我是懶了。。。
總體來說這個題是比較簡單的字符串處理,可是我還是三遍才AC,也是菜的摳腳了。。。