题目链接: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