上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:
2/2=12/2=1 、 3+2=53+2=5 、 9=39=3 、 9=39=3 、 0%=00%=0 、叁 =3=3 、 5−2=35−2=3 、 9/3=39/3=3 、 1×3=31×3=3 、 23=823=8 、 8/2=48/2=4 ,最后得到的电话号码就是 153 3033 3384。
本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。
输入
输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(+
)、减(-
)、乘(*
)、除(/
)、取余(%
,注意这不是上图中的百分比)、开平方根号(sqrt
)、指数(^
)和文字(即 0 到 9 的全小写汉语拼音,如ling
表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。
输出
在一行中给出电话号码,数字间不要空格。
输入样例 1
2/2 3+2 sqrt9 sqrt9 6%2 san 5-2 9/3 1*3 2^3 8/2
输出样例 1
15330333384
#include<bits/stdc++.h>
using namespace std;
int main(){
string exper;
map<string,int> mp={
{"ling",0},{"yi",1},
{"er",2},{"san",3},
{"si",4},{"wu",5},
{"liu",6},{"qi",7},
{"ba",8},{"jiu",9},
};
for(int i=0;i<11;i++){
string per;
int id=0;
int sum=0;
cin>>per;/*有空格则输入getline*/
if((id=per.find("+"))!=-1){
sum=stoi(per.substr(0,id))+stoi(per.substr(id+1));
}
else if((id=per.find("-"))!=-1){
sum=stoi(per.substr(0,id))-stoi(per.substr(id+1));
}
else if((id=per.find("*"))!=-1){
sum=stoi(per.substr(0,id))*stoi(per.substr(id+1));
}
else if((id=per.find("/"))!=-1){
sum=stoi(per.substr(0,id))/stoi(per.substr(id+1));
}
else if((id=per.find("%"))!=-1){
sum=stoi(per.substr(0,id))%stoi(per.substr(id+1));
}
else if((id=per.find("%"))!=-1){
sum=stoi(per.substr(0,id))%stoi(per.substr(id+1));
}
else if((id=per.find("^"))!=-1){
sum=(int)pow(stoi(per.substr(0,id)),stoi(per.substr(id+1)));
}
else if(per.substr(0,4)=="sqrt"){
sum=(int)sqrt(stoi(per.substr(4)));/*注意被开根数不只是个位数,应截取至末尾*/
}
else if(mp.count(per)){
sum=mp[per];
}
else sum=stoi(per);/*至多1个运算符代表可以没有运算符*/
exper+=to_string(sum);
}
cout<<exper<<endl;
return 0;
}
map::count()
是C++ STL中的内置函数,如果在映射容器中存在带有键K的元素,则该函数返回1。如果容器中不存在键为K的元素,则返回0。string中的count()函数——统计string字符串出现字符个数
string的大小写转换:tolower()和toupper()函数
string的分割/截取字符串:strtok() & substr(),string s2 = s1.substr(2,5); // 结果:23456-----参数5表示:截取的字符串的长度;
find()方法可以快速定位指定字符(串)的位置,未找到则返回-1
// 2. substr()的两种使用方法:
// substr(n): 截取从n位置到末尾的字符串