上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:
2/2=1、3+2=5、√9=3、√9=3、0%=0、叁=3、5−2=3、9/3=3、1×3=3、2^3=8、8/2=4,最后得到的电话号码就是 153 3033 3384。
本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。
输入格式:
输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(+
)、减(-
)、乘(*
)、除(/
)、取余(%
,注意这不是上图中的百分比)、开平方根号(sqrt
)、指数(^
)和文字(即 0 到 9 的全小写汉语拼音,如 ling
表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。
输出格式:
在一行中给出电话号码,数字间不要空格。
输入样例:
2/2
3+2
sqrt9
sqrt9
6%2
san
5-2
9/3
15330333384
输出样例:
15330333384
分析:s存储初始字符串,c存储操作符(如果有的话)。A存储数字拼音转换成int型数字的映射。题目说”题目保证每个计算至多只有1个运算符”,那么可能没有运算符,可能只有纯数字运算数,如果s的长度为1,则直接输出。否则看一下是不是求根运算,即前几位是”sqrt”。都不是的话,就要把数字分成三个部分,数字部分a和b、运算符c。然后根据具体是什么运算符,进行相对应的计算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <map> #include <cmath> #include <string> using namespace std; string s, c; map<string,int> A = {{"ling", 0}, {"yi", 1}, {"er", 2}, {"san", 3}, {"si", 4}, {"wu", 5}, {"liu", 6}, {"qi", 7}, {"ba", 8}, {"jiu", 9}}; int main() { for (int I = 0; I < 11; I++) { cin >> s; if (s.size() == 1) cout << s; else if (s[0] == 's' && s[1] == 'q') cout << sqrt(stoi(s.substr(4))); else if (A.count(s)) cout << A[s]; else { int a = 0, b = 0, i = 0; while(i < s.size() && isdigit(s[i])) a = a * 10 + s[i++] - '0'; c = s[i++]; while(i < s.size()) b = b * 10 + s[i++] - '0'; if (c == "+") cout << a + b; else if (c == "-") cout << a - b; else if (c == "*") cout << a * b; else if (c == "/") cout << a / b; else if (c == "%") cout << a % b; else cout << pow(a, b); } } return 0; } |
❤ 点击这里 -> 订阅《PAT | 蓝桥 | LeetCode学习路径 & 刷题经验》by 柳婼