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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章