P5238 整数校验器 题解
Doveqise
2019-03-03 07:29:17
T1字符串大模拟,洛谷3月月赛日推,有问题下见 ~~(极长的)~~ 代码注释。
```cpp
#include<bits/stdc++.h>
char start[30],end[30],target[200050];//不用string
int main()
{
int a,i,lenth,j,T1=0,T2=0,startlenth,endlenth;
scanf("%s%s%d",start,end,&a);
startlenth=strlen(start);//读入l
endlenth=strlen(end);//读入r
if(!a)//第一个数据点没有输入数据
{
return 0;
}
for(i=1;i<=a;i++)
{
j=1;
T1=0;
T2=0;
scanf("%s",target);
lenth=strlen(target);
if(lenth==1)
{
if(target[0]=='0')
{
if(start[0]!='-'&&start[0]!='0')
{
printf("2\n");
continue;
}
else
{
printf("0\n");
continue;
}
}//等于0情况
if(target[0]=='-')
{
printf("1\n");
continue;
}//负号特判一下
}
if(target[0]=='0')
{
printf("1\n");
continue;
}//以0开头的非法数据
if(target[0]=='-'&&target[1]=='0')
{
printf("1\n");
continue;
}//以-0开头的非法数据
if(lenth>21)
{
printf("2\n");
continue;
}//数字过大溢出
if(target[0]=='-')
{
if(start[0]!='-')
{
printf("2\n");
continue;
}//负数超过范围
else
{
if(startlenth>lenth)
{
T1=1;
j=lenth;
}
if(startlenth<lenth)
{
printf("2\n");
continue;
}
while(j<lenth)
{
if(start[j]!=target[j])
{
if(start[j]>target[j])
{
T1=1;
}
if(start[j]<target[j])
{
T1=2;
}
break;
}
else
{
j++;
}
}
if(j==lenth&&!T1)
{
T1=1;
}
j=0;
if(end[0]=='-')
{
j++;
}
if(end[0]!='-')
{
T2=1;
j=lenth;
}
else
{
if(endlenth<lenth)
{
printf("2\n");
continue;
}
if(endlenth>lenth)
{
T2=1;
j=lenth;
}
}
while(j<lenth)
{
if(end[j]!=target[j])
{
if(end[j]>target[j])
{
T2=1;
}
if(end[j]<target[j])
{
T2=2;
}
break;
}
else
{
j++;
}
}
if(j==lenth&&!T2)
{
T2=1;
}
if(T1==1&&T2==1)
{
printf("0\n");
continue;
}
else
{
printf("2\n");
continue;
}//一大坨(划掉)判大小
}
}
else
{
if(end[0]=='-')
{
printf("2\n");
continue;
}
if(start[0]=='-')
{
T1=1;
}
else
{
if(startlenth<lenth)
{
T1=1;
j=lenth;
}
if(startlenth>lenth)
{
printf("2\n");
continue;
}
}
j=0;
while(j<lenth)
{
if(start[j]!=target[j])
{
if(start[j]>target[j])
{
T1=1;
}
if(start[j]<target[j])
{
T1=1;
}
break;
}
else
{
j++;
}
}
if(j==lenth&&!T1)
{
T1=1;
}
j=0;
if(endlenth<lenth)
{
printf("2\n");
continue;
}
if(endlenth>lenth)
{
T2=1;
j=lenth;
}
while(j<lenth)
{
if(end[j]!=target[j])
{
if(end[j]>target[j])
{
T2=1;
}
if(end[j]<target[j])
{
T2=2;
}
break;
}
else
{
j++;
}
}
if(j==lenth&&!T2)
{
T2=1;
}
if(T1==1&&T2==1)
{
printf("0\n");
continue;
}
else
{
printf("2\n");
continue;
}//判大小+1
}
}
return 0;
}
```