poj2256人工智能?其實就是字符串處理啦

嗯這道題看題目好牛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,也是菜的摳腳了。。。

發佈了32 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章