mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
178 lines
4.1 KiB
C++
178 lines
4.1 KiB
C++
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#define OPER 1
|
||
|
#define NUM 2
|
||
|
#define INF 0x3fffffff
|
||
|
#define null x
|
||
|
#define END -1
|
||
|
#define MUTI 3
|
||
|
int n,T;
|
||
|
char oper_now,oper_last;
|
||
|
char in[1000];
|
||
|
__int64 ans,temp,num_equal;
|
||
|
int num,l;
|
||
|
int isnum(char a)
|
||
|
{
|
||
|
if(a>='0'&& a<='9')
|
||
|
return 1;
|
||
|
else return 0;
|
||
|
}
|
||
|
int findp()
|
||
|
{
|
||
|
if(num==l)return END;
|
||
|
int i,j;
|
||
|
int t=num;
|
||
|
if(in[t]=='='&& in[t+1]=='=')
|
||
|
{
|
||
|
num_equal =0;
|
||
|
while(in[num]=='=')
|
||
|
{
|
||
|
num_equal++;
|
||
|
num++;
|
||
|
}
|
||
|
return MUTI;
|
||
|
}
|
||
|
if(!isnum(in[num]))
|
||
|
{
|
||
|
num++;
|
||
|
return OPER;
|
||
|
}
|
||
|
__int64 tt=0;
|
||
|
int jj=10;
|
||
|
int ttp;
|
||
|
while(isnum(in[num]))
|
||
|
{
|
||
|
if((tt*jj+ (in[num]-'0'))>99999999|| (tt*jj+ (in[num]-'0'))<-99999999)
|
||
|
{
|
||
|
num++;
|
||
|
continue;
|
||
|
}
|
||
|
tt= tt*jj+ (in[num]-'0');
|
||
|
num++;
|
||
|
}
|
||
|
temp= tt;
|
||
|
return NUM;
|
||
|
}
|
||
|
__int64 cal_op()
|
||
|
{
|
||
|
__int64 aaa;
|
||
|
switch(oper_now)
|
||
|
{
|
||
|
case'-':return ans-temp;
|
||
|
case'+':return temp+ans;
|
||
|
case'*':aaa= (__int64)ans*temp;if(aaa>99999999|| aaa<-99999999)return INF;else return ans*temp;
|
||
|
case'/':if(temp!=0)return ans/temp;else return INF;
|
||
|
}
|
||
|
}
|
||
|
void cal()
|
||
|
{
|
||
|
if(in[num-1]!='=')
|
||
|
{
|
||
|
if(temp!=INF&& oper_now!=NULL)
|
||
|
{
|
||
|
ans= cal_op();
|
||
|
temp= INF;
|
||
|
}
|
||
|
else if(oper_now==NULL&& temp!=INF)
|
||
|
{
|
||
|
ans= temp;
|
||
|
temp= INF;
|
||
|
}
|
||
|
oper_last= oper_now;
|
||
|
oper_now= in[num-1];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if(oper_now!=NULL)
|
||
|
if(temp!=INF)
|
||
|
{
|
||
|
ans= cal_op();
|
||
|
temp= INF;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
temp= ans;
|
||
|
ans= cal_op();
|
||
|
temp= INF;
|
||
|
}
|
||
|
oper_now= NULL;
|
||
|
}
|
||
|
}
|
||
|
int main()
|
||
|
{
|
||
|
int i,j,t;
|
||
|
int op,pp;
|
||
|
scanf("%d",&T);
|
||
|
getchar();
|
||
|
for(pp=0; pp<T; pp++)
|
||
|
{
|
||
|
num=0;
|
||
|
ans=0;
|
||
|
temp= INF;
|
||
|
oper_now= NULL;
|
||
|
oper_last= NULL;
|
||
|
gets(in);
|
||
|
l= strlen(in);
|
||
|
int ttt;
|
||
|
int error=0;
|
||
|
while(op= findp(),op!=END&& !error)
|
||
|
{
|
||
|
if(ans>99999999|| ans<-99999999)
|
||
|
{
|
||
|
error=1;
|
||
|
goto end;
|
||
|
}
|
||
|
if(op==OPER)
|
||
|
{
|
||
|
cal();
|
||
|
}
|
||
|
else if(op==MUTI)
|
||
|
{
|
||
|
if(oper_now!=NULL)
|
||
|
{
|
||
|
if(temp!=INF)
|
||
|
{
|
||
|
for(i=0;i<num_equal;i++)
|
||
|
{
|
||
|
ans= cal_op();
|
||
|
if(ans>99999999|| ans<-99999999)
|
||
|
{
|
||
|
error=1;
|
||
|
goto end;
|
||
|
}
|
||
|
}
|
||
|
temp= INF;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ttt= ans;
|
||
|
for(i=0;i<num_equal;i++)
|
||
|
{
|
||
|
temp= ttt;
|
||
|
ans= cal_op();
|
||
|
if(ans>99999999|| ans<-99999999)
|
||
|
{
|
||
|
error=1;
|
||
|
goto end;
|
||
|
}
|
||
|
}
|
||
|
temp= INF;
|
||
|
}
|
||
|
}
|
||
|
oper_now= NULL;
|
||
|
}
|
||
|
if(ans>99999999|| ans<-99999999)
|
||
|
{
|
||
|
error=1;
|
||
|
goto end;
|
||
|
}
|
||
|
}
|
||
|
end:;
|
||
|
printf("Case %d: ",pp+1);
|
||
|
if(!error)
|
||
|
printf("%I64d\n",temp==INF?ans:temp);
|
||
|
else printf("ERROR\n");
|
||
|
}
|
||
|
return 0;
|
||
|
}
|