作为洛谷月赛的第一题,纯暴力,但是这里面的坑实在是太多了。。。
看到题解里面各位大佬都使用起了unsigned long long,没听过的我只能祭出打表比较法了
题意简单来说就是判断一个整数写法是否正常。
看了一下数据范围,发现这个只能用字符串进行读取啊。。。
于是我们根据字符串首位可以分为以下几种情况:
1.首位是0
如果只有一个0,那么一定是合法的,如果除了它以外还有别的东西,那么一定是不合法的。
除此之外只要判断是否在区间范围内即可(后面会讲如何判断)
2.首位是‘-’
这个应该坑了一批人,但是我比赛时没错在这。。。
如果只有一个‘-’,那么一定是不合法的
如果是-0,那么也是不合法的
如果是-后面一位不是0,那么一定是合法的
3.首位是1-9的数
合法了!
好的,重点来了
那么接下来讲如何判断是否在区间内。
题中有一个隐含条件,如果读入的东西爆longlong了,那么一定不在区间内,而如果不爆的话,我们就可以转化成正整数,那么问题就成了如何判断爆不爆
于是就惊现了毒瘤打法:打表
首先,将2^63-1打出来,发现是19位,那么大于19位直接判定爆了,等于的话就加一个特判,逐位比较。那么负数也是同理了。。。
所以这道题就讲完了。。。
最后,附上本题代码:
1 #include<cstdio> 2 #include<cstring> 3 #define LL long long 4 using namespace std; 5 char x[1005]; 6 LL T,len,l,r; 7 int temp[25]; 8 bool jd1() 9 { 10 for(int i=1; i<=18; i++) 11 { 12 if(x[i]-'0'>temp[i]) 13 { 14 return 1; 15 } 16 else if(x[i]-'0'==temp[i]) 17 { 18 continue; 19 } 20 else 21 { 22 return 0; 23 } 24 } 25 if(x[19]-'0'>temp[19]+1) 26 { 27 return 1; 28 } 29 else 30 { 31 return 0; 32 } 33 } 34 bool jd2() 35 { 36 for(int i=1; i<=19; i++) 37 { 38 if(x[i-1]-'0'>temp[i]) 39 { 40 return 1; 41 } 42 else if(x[i-1]-'0'==temp[i]) 43 { 44 continue; 45 } 46 else 47 { 48 return 0; 49 } 50 } 51 return 0; 52 } 53 bool judge() 54 { 55 LL s=0; 56 if(x[0]=='-') 57 { 58 if(len==20) 59 { 60 if(jd1()==1) 61 { 62 return 0; 63 } 64 } 65 if(len>20) 66 { 67 return 0; 68 } 69 for(int i=1; i<=len-1; i++) 70 { 71 s=(s<<3)+(s<<1)+x[i]-'0'; 72 } 73 s-=s*2; 74 } 75 else 76 { 77 if(len==19) 78 { 79 if(jd2()==1) 80 { 81 return 0; 82 } 83 } 84 if(len>19) 85 { 86 return 0; 87 } 88 for(int i=0; i<=len-1; i++) 89 { 90 s=(s<<3)+(s<<1)+x[i]-'0'; 91 } 92 } 93 if(s>=l&&s<=r) 94 { 95 return 1; 96 } 97 else 98 { 99 return 0; 100 } 101 } 102 int main() 103 { 104 temp[1]=9; 105 temp[2]=2; 106 temp[3]=2; 107 temp[4]=3; 108 temp[5]=3; 109 temp[6]=7; 110 temp[7]=2; 111 temp[8]=0; 112 temp[9]=3; 113 temp[10]=6; 114 temp[11]=8; 115 temp[12]=5; 116 temp[13]=4; 117 temp[14]=7; 118 temp[15]=7; 119 temp[16]=5; 120 temp[17]=8; 121 temp[18]=0; 122 temp[19]=7; 123 scanf("%lld%lld%lld",&l,&r,&T); 124 for(int i=1; i<=T; i++) 125 { 126 scanf("%s",x); 127 len=strlen(x); 128 if(x[0]=='0') 129 { 130 if(len==1) 131 { 132 if(judge()==1) 133 { 134 printf("0\n"); 135 } 136 else 137 { 138 printf("2\n"); 139 } 140 } 141 else 142 { 143 printf("1\n"); 144 } 145 } 146 else if(x[0]=='-') 147 { 148 if(len==1) 149 { 150 printf("1\n"); 151 } 152 else 153 { 154 if(x[1]=='0') 155 { 156 printf("1\n"); 157 } 158 else 159 { 160 if(judge()==1) 161 { 162 printf("0\n"); 163 } 164 else 165 { 166 printf("2\n"); 167 } 168 } 169 } 170 } 171 else 172 { 173 if(judge()==1) 174 { 175 printf("0\n"); 176 } 177 else 178 { 179 printf("2\n"); 180 } 181 } 182 } 183 return 0; 184 }