题目:加乘表达式
读入字符串最多只包含加法和乘法的算术表达式,输出计算结果,题目保证最多只有一次乘法。
输入格式
一个最多只包含加法和乘法的算术表达式字符串s,长度不超过30。
输出格式
一个整数,题目保证答案不会超过10^9。
输入/输出例子1
输入:
10+3*5+12
输出:
37
输入/输出例子2
输入:
10+12
输出:
22
分析问题:
找到相乘的两个数,计算结果,替换原来的子串,然后表达式就变成只有加法的算术表达式了,然后就可以用合集一的方法解决。
"10+3*5+12", 找出"3*5",计算结果是15,用"15"替换s的"3*5",s就变成"10+15+12",只有加法了,再用例题的方法解决。
程序实现:
#include<bits/stdc++.h>
using namespace std;
int StoI(string t)
{
stringstream sin;
sin<<t;
int d;
sin>>d;
return d;
}
string ItoS(int d)
{
stringstream sin;
sin<<d;
string t;
sin>>t;
return t;
}
int findOp(string t, char op)
{
for(int i=0; i<t.size(); i++)
if(t[i] == op )
return i;
return -1;
}
int LeftDigitPos(string s, int p)
{
int left;
for(int i=p; i>=0; i--){
if(s[i]>='0' && s[i]<='9') left = i;
else break;
}
return left;
}
int RightDigitPos(string s, int p)
{
int right;
for(int i=p; i<s.size(); i++){
if(s[i]>='0' && s[i]<='9') right = i;
else break;
}
return right;
}
int Plus(string s)
{
for(int index=findOp(s,'+'); index!=-1; index=findOp(s,'+'))
{
int left = LeftDigitPos(s, index-1);
string sa = s.substr(left,index-left);
int a = StoI(sa);
int right = RightDigitPos(s,index+1);
string sb = s.substr(index+1,right-index);
int b = StoI(sb);
int c = a + b;
string sc = ItoS(c);
s = s.substr(0,left) + sc + s.substr(right+1,s.size()-right-1);
}
return StoI(s);
}
int Plus_Mulity(string s)
{
int index = findOp(s,'*');
if(index==-1) return Plus(s);
int left = LeftDigitPos(s, index-1);
string sa = s.substr(left,index-left);
int a = StoI(sa);
int right = RightDigitPos(s,index+1);
string sb = s.substr(index+1,right-index);
int b = StoI(sb);
int c = a * b;
string sc = ItoS(c);
s = s.substr(0,left) + sc + s.substr(right+1,s.size()-right-1);
return Plus(s);
}
int main()
{
string s;
cin>>s;
int ans = Plus_Mulity(s);
cout<<ans<<endl;
return 0;
}