原题链接:[NOIP2005]等价表达式
解题思路:
注意事项:
参考代码:
一开始编了个程序,不知咋的指针越界。正确程序:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
char st[1001],a[1000];
string st1;
int ans1,ans2,b[1000],atop,btop,num[1000],n;
int pow1(int x,int y)//计算幂次方 {
int hh=x;
for (int i=2;i<=y;++i)
{
x*=hh;
x%=32767;
} return x;
}
void js()//四个运算(运算内容为数字栈的顶上两个数和运算符栈的顶上的运算符) {
if (a[atop]=='+') b[btop-1]+=b[btop];
if (a[atop]=='-') b[btop-1]-=b[btop];
if (a[atop]=='*') b[btop-1]*=b[btop];
if (a[atop]=='^') b[btop-1]=pow1(b[btop-1],b[btop]);
b[btop]=0;
--btop;
b[btop]%=32767;
a[atop]='\0';
--atop;
}
void doit(){
int i,x;
atop=0;//符号
btop=0;//数字
gets(st);
for (i=0;i<=strlen(st)-1;++i)
{ //
if (st[i]==' ') continue;
if (st[i]=='(') a[++atop]='(';//左括号则符号入栈
if (st[i]==')'&&atop>=1)//右括号则清空左到右括号间的内容
{
while (a[atop]!='('&&atop>=1)
js();
a[atop]='\0';
--atop;
}
if (st[i]=='+'||st[i]=='-'||st[i]=='*'||st[i]=='^')//若是运算符且该运算符的运算优先级比前一个低就把前一个先算出来
{
while (num[st[i]]<=num[a[atop]]&&atop>=1)
js();
a[++atop]=st[i];
}
if (st[i]=='a')
b[++btop]=3;//将a代入一个数(3)
if (st[i]>=48&&st[i]<=57)//可能数字是多位数
{
int x=0;
while (st[i]>=48&&st[i]<=57)
{
x=x*10+st[i]-48;
++i;
}
--i;
b[++btop]=x;
}
}
while (atop!=0&&a[atop]!='('&&a[atop]!=')')//将未运算完的内容运算完
js();
ans2=(b[1]+32767)%32767;
}
int main()
{
int x,i;
num['^']=3;
num['*']=2;
num['+']=num['-']=1;//num表示运算符优先级
doit();
ans1=ans2;//ans1表示题干表达式的结果,ans2表示选项表达式的结果
cin>>n;getchar();//如果少了getchar本地过不了
for (i=1;i<=n;++i)
{
doit();
if (ans1==ans2)
cout<<char(i+64);
}
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复