题解-洛谷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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理