赞
踩
成绩 | 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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。