题解-洛谷P1981 表达式求值(模拟+处理优先级的递归)

https://www.luogu.org/problemnew/show/P1981

(原题链接)

显然乘法的优先级高与加法,因此碰到乘号就要优先把一连串与乘号相连的数算出,很容易想到递归。可用普通的“从头扫到尾”的方法,以加号、乘号、及字符串尾的结束符(‘\0’)为间隔读入数字(因结尾没有符号,所以别忘了若不特别处理结尾,循环过完后会不处理最后读入的数)。

因数据会很大,题目善良的说“注意:当答案长度多于 4 位时,请只输出最后4 位,前导0 不输出”,有了这句话,我们的运算就只有后四位有关了(无论是加法还是乘法,能影响结果后四位的只有加数或因数的后四位),因此我们可以忽略第五位以后,即每次运算后都%10000。但就算2个数都小于10000,它们的和或积也有可能超过10000,因此在最后的结果别忘了再%10000。需用文件的同学最后也别忘了加上(或去掉)双斜线。

上代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 using namespace std;
 5 string suanshi;
 6 int l,total=0,g,i;
 7 long long a[100002];
 8 long long chengfa()
 9 {
10     i++;
11     for(;i<=l;i++)
12     {
13         if(suanshi[i]>='0'&&suanshi[i]<='9')
14                 a[g]=(a[g]*10+suanshi[i]-'0')%10000;
15         else
16         if(suanshi[i]=='+'||suanshi[i]=='\0')
17             {
18                 g++;
19                 return a[g-1];
20             }
21         else
22         if(suanshi[i]=='*')
23         {
24             g++;
25             return a[g-1]*chengfa()%10000;
26         }
27     }
28 }
29 int main()
30 {
31     cin>>suanshi;
32     l=suanshi.length();
33     g=1;
34     for(i=0;i<=l;++i)
35     {
36         if(suanshi[i]>='0'&&suanshi[i]<='9') a[g]=a[g]*10+suanshi[i]-'0';
37         else if(suanshi[i]=='+'||suanshi[i]=='\0')
38             {
39                 total=(total+a[g]%10000)%10000;
40                 g++;
41             }
42         else
43         if(suanshi[i]=='*')
44         {
45             g++;
46             total=total+a[g-1]*chengfa()%10000;
47         }            
48     }
49     cout<<total%10000;
50     return 0;
51 }

 

转载于:https://www.cnblogs.com/InductiveSorting-QYF/p/10403769.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值