题解 P5238 【整数校验器】

这是一道比较简单的题,涉及少量字符串相关知识。

需要注意的点:

  • 合法性判定

  • 带正负的高精大小比对

部分坑点:

  • 双负时绝对值大的数反而小

  • 需要依据正负性选择判定大小方法,且须在判定时去掉符号

  • “-“是一部分数据,因为:

    保证 $x$ 长度至少为 11 且仅由 ‘0’~’9’ 及 ‘-‘ 构成,且 ‘-‘ 只会出现在第一个字符。

好了,一切尽在代码中。上代码——

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<iostream>
#include<string>
using namespace std;
bool pn(string a) //正负判定
{
if(a[0]=='-') return false;
else return true;
}
int comp(string a,string b) //比对
{
if(pn(a)==true && pn(b)==false) return 1;
if(pn(a)==false && pn(b)==true) return 0;
//前置判定,省去一边去一遍不去之苦
if(pn(a)==true && pn(b) ==true) //双正判定
{
if(a.length()>b.length()) return 1;
if(a.length()<b.length()) return 0;
for(int y=0;y<a.length();y++)
{
if(a[y]>b[y]) return 1;
if(a[y]<b[y]) return 0;
}
return 2;
}
if(pn(a)==false && pn(b)==false) //双负判定(注意几乎是反过来的!)
{
if(a.length()<b.length()) return 1;
if(a.length()>b.length()) return 0;
for(int y=1;y<a.length();y++) //习惯于忽略负号
{
if(a[y]<b[y]) return 1;
if(a[y]>b[y]) return 0;
}
return 2;
}
}
bool val(string a) //合法性判定
{
if(a=="0") return true; //对0提前判定,避免与后冲突
if(a=="-") return false; //这种数据害得我最终分少了10分
if(a[0]=='-' && a[1]=='0') return false; //-0~类
if(a[0]=='0') return false; //0~类
return true;
}
string l,r;
int t;
int main()
{
cin>>l>>r>>t;
string temp;
for(int f=0;f<t;f++)
{
cin>>temp;
if(comp(temp,l)!=0 && comp(temp,r)!=1 && val(temp)==true)
{
cout<<'0'<<endl;
continue;
}
if(val(temp)==false)
{
cout<<'1'<<endl;
continue;
}

if(comp(temp,l)==0 || comp(temp,r)==1)
{
cout<<'2'<<endl;
continue;
}
}
return 0;
}
作者

Elanda

发布于

2024-11-16

更新于

2024-12-05

许可协议