题目链接:http://poj.org/problem?id=2256
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 1323 | Accepted: 643 |
Description
Input
Concept ::= ‘P‘ | ‘U‘ | ‘I‘ Prefix ::= ‘m‘ | ‘k‘ | ‘M‘ Unit ::= ‘W‘ | ‘V‘ | ‘A‘
Output
Sample Input
3 If the voltage is U=200V and the current is I=4.5A, which power is generated? A light-bulb yields P=100W and the voltage is U=220V. Compute the current, please. bla bla bla lightning strike I=2A bla bla bla P=2.5MW bla bla voltage?
Sample Output
Problem #1 P=900.00W Problem #2 I=0.45A Problem #3 U=1250000.00V
Source
题意:给定一个文本,提取其中的已知条件,根据公式计算结果。
题解:字符串模拟题。题目描述中已经说明等于号不会出现在除"已知条件"外其他的地方,所以可以根据这个来把两个已知条件抠出来。提取出来后,把里面的字符形式的数字转换成double型的数字。已知两个条件计算第三个条件便是。这种题目没有什么特定解法,主要是要有熟悉字符串并且考虑全面。具体细节实现看代码。
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
string text, Map = "PUI", pMap = "mkM",out="WVA";
int t; double res[3];
int Hash(char c,string x){
for (int i = 0; i<3; i++)
if (x[i] == c)return i; return -1;
}
double pHash(char c){
switch (c){
case 'm':return 0.001;
case 'k':return 1000;
case 'M':return 1000000;
}
}
string deal(string s, int flag){
int len = s.size(), b, e;
string tmpstr;
if (flag){//第二个等号
for (int i = len - 1; i > 0; i--)
if (s[i] == '='){
b=i-1;
for(int j=i+1;j<len;j++)
if(Hash(s[j],out)!=-1||j==len-1){
e=j;break;
}
tmpstr = s.substr(b, e - b + 1);
break;
}
}
else{ //第一个等号
for (int i = 0; i<len; i++)
if (s[i] == '='){
b=i-1;
for(int j=i+1;j<len;j++)
if(Hash(s[j],out)!=-1||j==len-1){
e=j;break;
}
tmpstr = s.substr(b, e - b + 1); break;
}
}
return tmpstr;
}
double ToNum(string s){ //把数字抠出来
double sum = 0;
int len = s.size(), flag = 0;
for (int i = 2; i<len - 1; i++){
if (s[i] == '.'){
flag = -1; continue;
}
if (s[i] >= 'A'&&s[i] <= 'Z'||s[i]>='a'&&s[i]<='z'){
sum *= pHash(s[i]); break;
}
if (flag)sum += (s[i] - '0')*pow(10.0, flag), flag--;
else sum = (s[i] - '0')+sum*10;
}
return sum;
}
double calc(int k){
switch (k){
case 0:return res[1] * res[2];
case 1:return res[0] / res[2];
case 2:return res[0] / res[1];
}
}
int main()
{
cin.sync_with_stdio(false);
cin >> t; cin.ignore(); //吃掉那个回车,这个不能少
for (int k = 1; k <= t; k++){
cout << "Problem #" << k << endl;
int flag[3] = { 0 };
getline(cin, text);
string s1 = deal(text, 0),s2 = deal(text, 1);
int pos1 = Hash(s1[0],Map), pos2 = Hash(s2[0],Map);
flag[pos1] = 1; flag[pos2] = 1;
res[pos1] = ToNum(s1); res[pos2] = ToNum(s2);
for (int i = 0; i<3; i++)
if (!flag[i]){
printf("%c=%.2lf%c\n\n", Map[i], calc(i),out[i]); break;
}
}
return 0;
}
【转载请注明出处】
作者:MummyDing
出处:http://blog.csdn.net/mummyding/article/details/43818357
POJ 2256 Artificial Intelligence?【字符串处理】
原文:http://blog.csdn.net/mummyding/article/details/43818357