成绩 | 10 | 开启时间 | 2021年09月24日 星期五 20:00 |
折扣 | 0.8 | 折扣时间 | 2021年10月10日 星期日 23:55 |
允许迟交 | 否 | 关闭时间 | 2021年10月17日 星期日 23:55 |
背景:
我们的教材中已经介绍了表达式求值的算法,现在我们将该算法的功能进行扩展,要求可以处理的运算符包括:+、-、*、/、%(整数取余)、^(乘方)、(、)。
要求:
采用算符优先算法,计算的中间结果只保留整数。
输入:
第一行为整数N。表示下面有N个表达式
从第二行起的后面N行为N个由整数构成的表达式
输出:
共N行,每行为相应表达式的计算结果。
如果判断出表达式有错误,则输出:error.
如果在计算过程中出现除数为0的情况,则输出:Divide 0.
特殊情况说明:
在表达式中,如果操作数出现负数(例如-8),则要特别注意。例如:
10加-8表示为:10+-8。
10减-8表示为:10--8。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
代码
最近要忙保研的事,就先把代码贴出来,题解之后会补上(也许补不上了也说不定哈哈哈)
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
char pro[9][9]={
{'>','>','<','<','<','>','>','<','<'},
{'>','>','<','<','<','>','>','<','<'},
{'>','>','>','>','<','>','>','<','>'},
{'>','>','>','>','<','>','>','<','>'},
{'<','<','<','<','<','=',' ','<','<'},
{'>','>','>','>',' ','>','>','>','>'},
{'<','<','<','<','<',' ','=','<','<'},
{'>','>','>','>','<','>','>','<','>'},
{'>','>','>','>','<','>','>','<','>'}
};
int op(int a, int b, char opt)
{
if(opt=='+')
{
return a+b;
}
else if(opt=='-')
{
return a-b;
}
else if(opt=='*')
{
return a*b;
}
else if(opt=='/')
{
if(b==0)
{
printf("Divide 0.\n");
return 0x3f3f3f3f;
}
else
{
return a/b;
}
}
else if(opt=='%')
{
return a%b;
}
else if(opt=='^')
{
if(b>=0)
{
return pow(a,b);
}
else
{
printf("error.\n");
return 0x3f3f3f3f;
}
}
else
{
printf("error.\n");
return 0x3f3f3f3f;
}
}
int shu[100010];
char opt[100010];
char ex[100010];
int main()
{
int N;
int i,j,k,m,n,a,b;
int flag=0;
int flag1=0;
int flag2=0;
int flag3=0;
int flag4=0;
int flag5=0;
char Opt[9]={'+','-','*','/','(',')','#','^','%'};
memset(ex,'\0',sizeof(ex));
int exp=0,shup=-1,optp=-1;
scanf("%d",&N);
while(N--)
{
char c;
flag=2;
flag1=0;
flag2=0;
flag3=0;
flag4=0;
flag5=0;
k=0;
int fuhaoyou=0;
scanf("%s",ex);
strcat(ex,"#");
opt[++optp]='#';
for(a=0;a<=strlen(ex)-3;a++)
{
flag5=0;
int fuhao=a;
if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')
{
flag5++;
fuhao++;
}
if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')
{
flag5++;
fuhao++;
}
if(ex[fuhao]=='+'||ex[fuhao]=='-'||ex[fuhao]=='*'||ex[fuhao]=='/'||ex[fuhao]=='%'||ex[fuhao]=='^')
{
flag5++;
fuhao++;
}
if(flag5>=3)
{
printf("error.\n");
memset(ex,'\0',sizeof(ex));
memset(shu,0,sizeof(shu));
memset(opt,'\0',sizeof(opt));
shup=-1;
flag1++;
exp=0;
flag5=0;
optp=-1;
fuhaoyou++;
break;
}
}
while(ex[exp]!='#'||opt[optp]!='#')
{
if(fuhaoyou!=0)
{
break;
}
if(ex[exp]>='0'&&ex[exp]<='9')
{
if(flag==0)
{
int aaa=0;
aaa=shu[shup--]*10+(ex[exp++]-'0');
shu[++shup]=aaa;
flag=0;
}
else
{
shu[++shup]=ex[exp++]-'0';
flag=0;
}
}
else
{
if(flag4==1)
{
shu[0]*=-1;
flag4=0;
}
if(flag==1)
{
if(ex[exp]=='+'||ex[exp]=='-'||ex[exp]=='*'||ex[exp]=='/'||ex[exp]=='^'||ex[exp]=='%')
{
printf("error.\n");
flag1++;
memset(ex,'\0',sizeof(ex));
memset(shu,0,sizeof(shu));
memset(opt,'\0',sizeof(opt));
shup=-1;
optp=-1;
exp=0;
break;
}
}
if(ex[exp]=='(')
{
flag=1;
int s=exp+1;
int d=s+1;
if(ex[s]=='-'&&ex[d]>='0'&&ex[d]<='9')
{
flag=2;
flag4=1;
exp=s+1;
opt[++optp]='(';
continue;
}
}
else
{
flag=2;
}
if(optp==-1)
{
printf("error.\n");
memset(ex,'\0',sizeof(ex));
memset(shu,0,sizeof(shu));
memset(opt,'\0',sizeof(opt));
flag1++;
shup=-1;
optp=-1;
exp=0;
break;
}
else
{
char com=opt[optp--];
char Ex;
for(i=0;i<9;i++)
{
if(Opt[i]==com)
{
m=i;
}
if(Opt[i]==ex[exp])
{
n=i;
}
}
Ex=pro[m][n];
if(Ex=='<')
{
if(exp==0&&ex[exp]=='-')
{
flag4=1;
exp++;
optp++;
continue;
}
opt[++optp]=com;
opt[++optp]=ex[exp++];
continue;
}
else if(Ex=='=')
{
exp++;
continue;
}
else if(Ex==' ')
{
printf("error.\n");
memset(ex,'\0',sizeof(ex));
memset(shu,0,sizeof(shu));
memset(opt,'\0',sizeof(opt));
shup=-1;
flag1++;
exp=0;
optp=-1;
break;
}
else
{
int q=exp-1;
if(ex[exp]=='-')
{
if(ex[q]=='('||ex[q]=='*'||ex[q]=='/'||ex[q]=='%'||ex[q]=='+'||ex[q]=='-')
{
opt[++optp]=com;
exp++;
flag2=1;
continue;
}
}
if(flag2==1)
{
shu[shup]*=-1;
flag2=0;
}
if(flag3==1)
{
shu[--shup]*=-1;
shup++;
flag3=0;
}
b=shu[shup--];
a=shu[shup--];
k=op(a,b,com);
if(k==0x3f3f3f3f)
{
memset(ex,'\0',sizeof(ex));
shup=-1;
optp=-1;
exp=0;
memset(shu,0,sizeof(shu));
memset(opt,'\0',sizeof(opt));
break;
}
else
{
shu[++shup]=k;
}
continue;
}
exp++;
}
}
}
if(shup==0&&optp==0)
{
if(flag4==1)
{
printf("%d\n",-shu[shup]);
flag4=0;
}
else
{
printf("%d\n",shu[shup]);
}
}
else
{
if(k!=0x3f3f3f3f&&flag1==0)
{
printf("error.\n");
}
}
memset(ex,'\0',sizeof(ex));
memset(shu,0,sizeof(shu));
memset(opt,'\0',sizeof(opt));
exp=0;
fuhaoyou=0;
shup=-1;
flag1=0;
optp=-1;
}
return 0;
}