NOIP 2005 等价表达式 (TYVJ P1060)
做题记录: 2016-08-10 23:35:09
背景
描述
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
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%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
输入格式
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
输出格式
测试样例1
输入
(a+ 1)^2
3
(a -1)^ 2+4* a
a +1+ a
a^2 +2*a *1+1 ^2+ 10-10+a- a
输出
AC
代码
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- long long check,final;
- long long num[],op[];
- string s;
- long long power(long long a,long long b)
- {
- long long k=;
- for(int i=;i<b;i++)
- k*=a;
- return k;
- }
- void cul(int p,int op)
- {
- if(op==) num[p-]=num[p-]+num[p];
- if(op==) num[p-]=num[p-]-num[p];
- if(op==) num[p-]=num[p-]*num[p];
- // if(op==3) num[p-1]=num[p-1]/num[p];
- if(op==) num[p-]=power( num[p-],num[p] );
- }
- long long result(string str){
- int op_nxt;//下一个操作符
- int len=str.length(),p=-,q=-;//p数字栈指针 ,q符号栈指针
- long long num_nxt=;
- for(int i=;i<len;i++){
- if(str[i]=='a') num[++p]=check;
- else if(str[i]>=''&&str[i]<='') num_nxt=num_nxt*+(str[i]-'');
- else if(str[i]!=' '){
- if(num_nxt!=){
- num[++p]=num_nxt;
- num_nxt=;
- }
- if(str[i]=='+') op_nxt=;
- if(str[i]=='-') op_nxt=;
- if(str[i]=='*') op_nxt=;
- // if(str[i]=='/') op_nxt=3;
- if(str[i]=='^') op_nxt=;
- if(str[i]=='(') op_nxt=;
- if(str[i]==')') op_nxt=;
- if(op_nxt==) op[++q]=op_nxt;
- else if(op_nxt==) while(q>=&&op[q--]!=) cul(p--,op[q+]);
- else {
- while(q>=&&op[q]<=&&op[q]/>=op_nxt/) cul(p--,op[q--]);
- op[++q]=op_nxt;
- }
- }
- }
- //清空堆栈
- if(num_nxt!=){
- num[++p]=num_nxt;
- num_nxt=;
- }
- while(q>=) cul(p--,op[q--]);
- return num[];
- }
- int main(){
- freopen("01.txt","r",stdin);
- string str1,str2;
- int n;
- final=;
- getline(cin,str1);
- cin>>n;
- getline(cin,str2);
- while(n--)
- {
- bool flag=true;
- getline(cin,str2);
- for (int i=;i<=;i++)
- {
- check=i;
- if (result(str1)!=result(str2))
- {
- flag=false;
- break;
- }
- }
- if (flag) cout<<(char)('A'+final);
- final++;
- }
- cout<<endl;
- return ;
- }
这题写了我老半天了,中间还睡着了好几次,非常困惑啊。
这题范围比较小,long long integer直接能过,像下面给出的其中一道题目就需要高精度。(假装我写了的样子~)
顺便附同类题目链接(TYVJ):
http://www.tyvj.cn/Solution/8759
基本功还是要好好练练,为了提升代码阅读能力,仅给出主要注释。
表达式系列问题解答:
http://www.cnblogs.com/radiumlrb/p/5778357.html
NOIP 2005 等价表达式 (TYVJ P1060)的更多相关文章
- NOIP 2005 等价表达式 题解
题意 给一个表达式然后再给n个表达式,判断是否等价 一道大模拟题,将a带为数,并且取模防止溢出 #include<bits/stdc++.h> using namespace std; c ...
- noip 2005 等价表达式
/* 开始想的是 维护a的每个指数的系数 然而不好办 然而还有^10^10^10这种数据 特殊值带入吧 多搞几个素数 接下来就是玄学的事了 给a赋值之后 就是简单地表达式求值 虽然思路简单 但是字符串 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 数据结构--栈 codevs 1107 等价表达式
codevs 1107 等价表达式 2005年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Descripti ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 等价表达式(noip2005)
3.等价表达式 [问题描述] 兵兵班的同学都喜欢数学这一科目,中秋聚会这天,数学课代表给大家出了个有关代数表达式的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也 ...
- 洛谷 P1054 等价表达式 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1054 等价表达式
洛谷 P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式, ...
- 【Tyvj 1060】【NOIP 2005】等价表达式
设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...
随机推荐
- EF – 3.EF数据查询基础(下)数据关联
5.5.1 <关于“数据关联”,你不一定清楚的事> 这讲视频比较全面地介绍了“一对一”.“一对多”和“多对多”三种数据关联类型在关系数据库和Entity Framework数据模型中的实现 ...
- Redis笔记(七)Java实现Redis消息队列
这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...
- MVC基础知识
1.View中获取Control和View: //获取控制器名称: ViewContext.RouteData.Values["controller"].ToString(); / ...
- oracle 11g r1 RAC增加新节点
在一套两节点的rac上增加一个新的节点,详细的操作记录如下: 已有节点RAC1,RAC2 一,环境及版本: 公司环境:Vmware Esxi 5.5 操作系统:Redhat 5.8 x86_64 ...
- 攻城狮在路上(贰) Spring(三)--- Spring 资源访问利器Resource接口
Spring为了更好的满足各种底层资源的访问需求.设计了一个Resource接口,提供了更强的访问底层资源的能力.Spring框架使用Resource装载各种资源,包括配置文件资源.国际化属性文件资源 ...
- wp8 入门到精通 ---转换
/// <summary> /// 颜色字符串转Color /// </summary> public static ...
- Windows Phone中获取UserAgent
进入WP8时代后,通过DeviceExtendedProperties获取到的DeviceName不再是手机型号了,这对于需要获得手机型号做一些事情的应用(如新浪微博的小尾巴)来说,影响是比较大的. ...
- 封装自己的printf函数
#include <stdio.h> #include <stdarg.h> //方式一 #define DBG_PRINT (printf("%s:%u %s:%s ...
- HDU 5876 Sparse Graph BFS 最短路
Sparse Graph Problem Description In graph theory, the complement of a graph G is a graph H on the ...
- windows下R语言在终端的运行
在windows下可以有多种方式来运行R,R导论的这些章节给出一些详细的指导. 通常在环境变量离包含R的安装目录类似于R\R-3.1.2\bin\x64的情况下,就可以在CMD下运行R程序了 注意我这 ...