算数表达式(四)

题目:加乘表达式II

读入字符串最多只包含加法和乘法的算术表达式,输出计算结果。

输入格式

一个最多只包含加法和乘法的算术表达式的字符串,长度不超过30。

输出格式

一个整数,题目保证答案不超过10^9。

输入/输出例子1

输入:

12+5*2*6+10+13*2

输出:

108

分析:

找到相乘的两个数,计算结果,替换原来的子串,然后表达式就变成只有加法的算术表达式了,然后就可以用例题的方法解决。

"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;
}

感谢观看,麻烦给我点个赞,谢谢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值