NC21181 重返小学

题目

题目描述

​ 时光依旧,岁月匆匆。转眼间,曾经的少年郭嘉烜已经长大成人,考上了一所优秀的大学——兰州大学。在经历了一年来自牛顿、莱布尼茨、拉普拉斯的精神洗礼后,他终于决定回到小学,重新回到加减乘除的怀抱中。

输入描述

第一行,一个整数 \(T (1≤T≤100000)\),表示案例的个数。

接下来的T行,每行一个字符串(长度小于等于 \(100\) ),字符串仅由0-9、+、-、*、/、^、!字符组成,数字表示一个数值,范围为 \([0,9]\),且数字不存在前导零,其他符号表示一种运算规则,规则的描述如下:

+:数字1 +数字2 =两个数字之和,+号的优先级为1

-:数字1 -数字2 =两个数字之差,-号的优先级为1

*:数字1 * 数字2 =两个数字之积,* 号的优先级为2

/:数字1 /数字2 =两个数字之商(舍去小数),/号的优先级为2

^:数字1 ^数字2 =数字1的数字2次方,^号的优先级为3

!:数字1 ! =数字1的阶乘,!号的优先级为4

按照优先级从高到低的顺序依次计算,同级运算时,从左到右依次计算。

输入保证对于每个字符串,满足上述条件,一行输入,以换行符结束。保证式子的表达式语义正确。特别的,一切数值计算均受限于模 \(65536\) 的数域,即每一步运算都要对 \(65536\) 取模,取模的规则同C语言规范。同时,任意数的 \(0\) 次方等于 \(1\) 。

输出描述

T行,T个整数。

每行输出对应案例表达式运算的结果,如遇到除以0的算数错误,请输出ArithmeticException。

示例1

输入

  1. 1
  2. 4*3/2^0+9

输出

  1. 21

说明

优先计算2!=2,之后以前一步的结果继续计算2!=2遇到换行符结束运算并输出

示例2

输入

  1. 2
  2. 2!!
  3. 3/2^4^4

输出

  1. 2
  2. ArithmeticException

说明

优先计算 2 ^ 4 ^ 4 ,由于其结果对 \(65536\) 取模为 \(0\) ,因此下一步运算变成 \(3/0\) 从而产生ArithmeticException

备注

建议使用C/C++解答本题。

题解

思路

知识点:分治。

按优先级给符号分类,记录每类符号最后一个出现的地方位置,随后找到优先级最低且符号位置存在的位置划分表达式为左右两边,对他们进行相同的操作,然后根据返回表达式值以及对应符号处理得到结果再返回到上一层。

在这里我们没有处理负号,看似无法划分左右,但实际上还是可以的。比如, \(-4\) 可以划分成空区间(左右端点越界)以及 \(4\) ,前者由于符号位置都不存在直接进入 \(StoI\) 函数,由于左右端点越界直接返回 \(0\) ;后者会被转换成 \(4\) ,最后就是 \(0-4=-4\) 成立。

乘方用快速幂,关于除法非法可以设置全局变量 \(flag\) 检验。

注意这道题阶乘打表不然超时,注意乘法可能过程越界。

时间复杂度 平均:\(O(nlogn)\) 最差: \(O(n^2)\)

空间复杂度 \(O(n)\)

代码

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. const int mod = 65536;
  5. int f[mod + 7];
  6. string s;
  7. bool flag;
  8. void fact(int n) {
  9. f[0] = 1;
  10. for (int i = 1;i <= n;i++) f[i] = f[i - 1] * i % mod;
  11. }
  12. int StoI(int l, int r) {
  13. int ans = 0;
  14. for (int i = l;i <= r;i++) ans = (ans * 10 + s[i] - '0') % mod;
  15. return ans;
  16. }
  17. int qpow(int a, int k) {
  18. int ans = 1;
  19. while (k) {
  20. if (k & 1) ans = 1LL * ans * a % mod;
  21. k >>= 1;
  22. a = 1LL * a * a % mod;
  23. }
  24. return ans;
  25. }
  26. int calc(int l, int r) {
  27. int pos[4] = { -1,-1,-1,-1 };///+-,*/,^,!
  28. for (int i = l;i <= r;i++) {///最后运算符号判断(无括号)
  29. if (s[i] == '+' || s[i] == '-') pos[0] = i;
  30. else if (s[i] == '*' || s[i] == '/') pos[1] = i;
  31. else if (s[i] == '^') pos[2] = i;
  32. else if (s[i] == '!') pos[3] = i;
  33. }
  34. if (!~pos[0] && !~pos[1] && !~pos[2] && !~pos[3]) return StoI(l, r);///纯数判断(无括号)
  35. else if (~pos[0]) {
  36. if (s[pos[0]] == '+') return (calc(l, pos[0] - 1) + calc(pos[0] + 1, r)) % mod;
  37. else if (s[pos[0]] == '-') return (calc(l, pos[0] - 1) - calc(pos[0] + 1, r) + mod) % mod;
  38. }
  39. else if (~pos[1]) {
  40. int lans = calc(l, pos[1] - 1);
  41. int rans = calc(pos[1] + 1, r);
  42. if (s[pos[1]] == '*') return 1LL * lans * rans % mod;
  43. else if (s[pos[1]] == '/') {
  44. if (rans) return lans / rans;
  45. else flag = 0;
  46. }
  47. }
  48. else if (~pos[2]) {
  49. if (s[pos[2]] == '^') return qpow(calc(l, pos[2] - 1), calc(pos[2] + 1, r));
  50. }
  51. else if (~pos[3]) {
  52. if (s[pos[3]] == '!') return f[calc(l, pos[3] - 1)];
  53. }
  54. return 0;///过编译
  55. }
  56. bool solve() {
  57. flag = 1;
  58. cin >> s;
  59. int ans = calc(0, s.length() - 1);
  60. if (flag) cout << ans << '\n';
  61. else return false;
  62. return true;
  63. }
  64. int main() {
  65. std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  66. fact(mod - 1);
  67. int t = 1;
  68. cin >> t;
  69. while (t--) {
  70. if (!solve()) cout << "ArithmeticException" << '\n';
  71. }
  72. return 0;
  73. }

NC21181 重返小学的更多相关文章

  1. [下载]北京新版小学英语五年级上册mp3点读APP

    义务教育教科书小学英语五年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:97872001 ...

  2. [Android下载]北京新版小学英语三年级上册点读手机软件

    小学英语三年级上册点读软件.根据2014年北京教改版教材编写,发音标准.实现点读功能.点到哪里读到哪里.哪里不会点哪里!北京教育科学研究院编写,北京出版社出版.ISBN:9787200108781   ...

  3. 用C语言编写生成小学四则运算程序

    使用软件——VS 2015 使用环境——C语言 早在上周我就开始使用C#语言做,由于最后一点问题而放弃,之后用C语言开始做,很顺利,但是也碰到了一些问题,但是通过了百度文库上的一些程序的借鉴和吴阿平同 ...

  4. 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序

    1. 编写一个能自动生成小学四则运算题目的程序.(10分)   基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图.   本题发一篇随笔,内容包括: 题 ...

  5. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

  6. 近几日小学flare3d,

    前言: Adobe虽然前2年砍掉了移动版flash player,以致H5大有可为, PC和移动端的2D世界不断被H5占领 不过FLASH已在3D方面,扩展出了新天地 FLARE 3D是 网页3D的新 ...

  7. sdut 2445 小学数学

    小学数学 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...

  8. McAfee重返科技业 研制D-Central防政府监视

    新闻链接:http://tech.qq.com/a/20131008/016127.htm 新闻时间: 10月8日编译 新闻正文:McAfee重返科技业 研制D-Central防政府监视 约翰·迈克菲 ...

  9. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

随机推荐

  1. linux常用理论(一)

    第一周 1.按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别. Debian Redhat issue 2.安装Centos7.9和ubuntu操作系统,创建一个自己名字的用户名,并可以 ...

  2. 攻防世界-MISC:base64stego

    这是攻防世界新手练习区的第十一题,题目如下: 点击下载附件一,发现是一个压缩包,点击解压,发现是需要密码才能解密 先用010editor打开这个压缩包,这里需要知道zip压缩包的组成部分,包括压缩源文 ...

  3. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

  4. XCTF练习题---MISC---pure-color

    XCTF练习题---MISC---pure-color flag:flag{true_steganographers_doesnt_need_any_tools} 解题步骤: 1.观察题目,下载附件 ...

  5. 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验

    移动互联网的发展给人们的社交和娱乐方式带来了很大的改变,以vlog.短视频等为代表的新兴文化样态正受到越来越多人的青睐.同时,随着AI智能.美颜修图等功能在图像视频编辑App中的应用,促使视频编辑效率 ...

  6. 多线程07:async、future、packaged_task、promise

    async.future.packaged_task.promise 本节内容需要包含头文件:#include <future> 一.std::async. std::future 创建后 ...

  7. R可视化:plot函数基础操作,小白教程

    最近迷恋上了画图,一方面是觉得挺有意思的,另一方面是觉得自己确实画图方面比较弱,所以决定比较系统地回顾反思一下,同时顺带记录下来分享给大家.也确实是好久好久没更新文章了,真的是杂事太多太忙太牵扯精力没 ...

  8. Cocos---简单案例:红气球

    红气球 知识点 场景切换 动画播放,帧事件,Tween 按钮控件 音效管理 案例介绍 开始界面 点击按钮自动进入游戏界面 游戏界面 游戏目的找出红气球,如果点击红气球意味着游戏成功,其余意味着游戏失败 ...

  9. SyntaxError: Non-UTF-8 code starting with '\xef' in file(已解决)

    错误原因: python代码中出现了中文字符 解决方案: 在python代码文件的第一行(必须是第一行)添加如下代码(随编码不同自行修改): #coding=utf-8

  10. 使用instanceof操作符判断对象类型及方法的重载

    学习内容: 一.使用instanceof操作符判断对象类型 1.instanceof操作符可以判断一个实例对象是否属于一个类. 语法:对象名 instanceof 类名 2.使用instanceof表 ...