vijos-1003等价表达式
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?这个选择题中的每个表达式都满足下面的性质:1. 表达式只可能包含一个变量‘a’。2. 表达式中出现的数都是正整数,而且都小于10000。3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)4.
幂指数只可能是1到10之间的正整数(包括1和10)。5. 表达式内部,头部或者尾部都可能有一些多余的空格。下面是一些合理的表达式的例子:((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。分析:
1.不需要考虑括号不匹配问题,输入绝对合法。
2.不需要考虑形如
(-3+a^7)*2
这样的情况。
3.另一方面,我认为只有试够11个数才能充分说明正确性:因为
a^10+k9a^9+k8a^8+.......=(a+3)^10+......
这是一个一元十次方程,它需要11个点来确定一条十次曲线。所以要将0-10都代入才能说明问题。
当然,如果这是一条6次曲线,7个点就够,可是谁有想写一个判断次数的函数呢?
4.因为取余运算,导致运算顺序不同,结果就不同。这是一个神坑。所以试的点少一点 ,取余数大一点就容易过。
#include<iostream> using namespace std; #define big 10007 #define test 8 char ti[51];//题干 int size;//选项个数 int result[test];//准备试的数 bool prior(char a, char b){//运算符a优先级是否大于b if (a == '^')return true; if (b == '^')return false; if (a == '*')return true; if (b == '*')return false; return true; } int power(int a, int b){//乘幂函数要取余 int i; int ans = 1; for (i = 0; i < b; i++){ ans *= a; ans %= big; } return ans; } int op(int a, int b, char o){ switch (o){ case '^':return power(a, b); case '*':a *= b; a %= big; return a; case '+':return (a + b) % big; case '-':return (a - b) % big; } } //x表示数字,o表示符号 int calculate(int x[], int xsize, char o[], int osize){ int i; int xstack[51]; int xtop = 0; char ostack[51]; int otop = 0; int xi, oi; xi = oi = 0; xstack[xtop++] = x[xi++]; while (xi<xsize&&oi<osize){ while (otop != 0 && prior(ostack[otop - 1], o[oi])){ xstack[xtop - 2] = op(xstack[xtop - 2], xstack[xtop - 1], ostack[otop - 1]); xtop--; otop--; } ostack[otop++] = o[oi++]; xstack[xtop++] = x[xi++]; } while (otop >0){ xstack[xtop - 2] = op(xstack[xtop - 2], xstack[xtop - 1], ostack[otop - 1]); xtop--; otop--; } return xstack[0]; } int go(char ex[], int a){ int i, j; int x[51]; int xi = 0; char o[51]; int oi = 0; i = 0; while (ex[i]){ while (ex[i] == ' ')i++; if (ex[i] == 0)break; if (ex[i] == '('){ int left = 1; char temp[51]; j = 0; i++; while (true){ temp[j] = ex[i]; if (temp[j] == '(')left++; else if (temp[j] == ')')left--; if (left == 0){ temp[j] = 0; x[xi++] = go(temp, a); i++; break; } i++; j++; } } else if (ex[i] == 'a'){ x[xi++] = a; i++; } else{ int n = 0; while (ex[i] >= '0'&&ex[i] <= '9'){ n *= 10; n += ex[i] - '0'; i++; } x[xi++] = n; } while (ex[i] == ' ')i++; if (ex[i] == 0)break; if (ex[i] == '+' || ex[i] == '-' || ex[i] == '*' || ex[i] == '^'){ o[oi++] = ex[i]; } i++; } return calculate(x, xi, o, oi); } int main(){ freopen("in.txt", "r", stdin); cin.getline(ti, sizeof(ti)); cin >> size; int i; for (i = 0; i < test; i++) { result[i] = go(ti, i); } char choose[51]; cin.getline(choose, 55); for (i = 0; i < size; i++){ cin.getline(choose, 55); int j; int ans; for (j = 0; j < test; j++){ ans = go(choose, j); if (ans != result[j])break; } if (j == test){ cout << (char)(i + 'A'); } } return 0; }
vijos-1003等价表达式的更多相关文章
- Vijos P1003 等价表达式 随机数+单调栈
题目链接:https://vijos.org/p/1003 题意: 1. 表达式只可能包含一个变量‘a’. 2. 表达式中出现的数都是正整数,而且都小于10000. 3. 表达式中可以包括四种运算‘+ ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- NOIP2005 等价表达式
题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...
随机推荐
- php遍历循环数组实现方法
简单利用foreach for list each while来遍历数组,包括普通的一维数组与二维数组遍历方法,下面详细的介绍了每个函数的使用方法. $foreach = array(1,2,3); ...
- Java 工程转 C#
一. 前言 由于要用c#写点东西,但是我不会c#啊,所以就只能先用Java写好,然后再看看 Java 和C# 的差别,再一点一点转嘛,谁知道,google一下,有软件可以直接把 Java 工程转为C ...
- Tomcat免安装配置2
Tomcat 是一款优秀的JSP/Servlet容器,最初由SUN开发,后来被贡献给了Apache社区.Tomcat现在的版本已到6.Tomcat6实现了Servlet2.5和JSP2.1规范.针对w ...
- Java开发之文件上传
文件上传有SmartUpload.Apache的Commons fileupload.我们今天介绍Commons fileupload的用法. 1.commons-fileupload-1.3.1.j ...
- sql中in和exists效率问题 转自百度知道
in和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询 ...
- Android开发中上线后修改应用名称的若干问题
一.在Android Studio 1.3中修改app的包名: 需求来源: 之前开发的app已经在腾讯的应用宝上线,应客户要求,app需要改名字,这个就有点麻烦了.如果申请改名字,要求如下: 截图上图 ...
- 第15章 设备无关位图_15.3 DIB和DDB的结合
第15章 设备相关位图_15.3 DIB和DDB的结合 15.3.1 从DIB创建DDB (1)hBitmap =CreateDIBitmap(…)——注意这名称会误导,实际上创建的是DDB 参数 说 ...
- VS Code
VS Code VS Code(Visual Studio Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.几乎完美的编辑器. 官网:https://code.visualstudi ...
- 网页下载Google Play 的App
前言 当你想在google play上下载某个应用,而无奈手机的系统并没有安装google servicess,此刻是否有些捉急? 本文分享的是一个网站,它可以无需手机而直接通过网页下载Google ...
- angular $http配置属性
$http请求的配置对象 $http()接受的配置对象可以包含以下属性: method:http请求方式,可以为GET,DELETE,HEAD,JSONP,POST,PUT url:字符串,请求的目标 ...