判断一个数的数据类型
除了BigInteger之外其它的都可以直接判断
所以主要是判断是否是BigInteger
可根据位数
那么只需要判断位数与边界值位数相同的情况
其余的就是一些小技巧了
#include<stdio.h>
#include<string.h>
int l;
char s[120];
char res[5][11]= {"byte","short","int","long","BigInteger"};
bool cmp() {
int x=(s[0]=='-'?1:0);
if(l>19+x)
return true;
if(l<19+x)
return false;
char bg[20]="9223372036854775807";
if(x)
bg[18]='8';
for(int i=x; i<l; i++) {
if(s[i]>bg[i-x])
return true;
if(s[i]<bg[i-x])
return false;
}
return false;
}
int judge() {
if(cmp())
return 4;
else {
__int64 sum=0;
int i=(s[0]=='-'?1:0);
for(; i<l; i++)
sum=sum*10+s[i]-'0';
if(s[0]=='-')
sum--;
if(sum<128)
return 0;
if(sum<32768)
return 1;
if(sum<=2147483647)
return 2;
else
return 3;
}
}
int main() {
while(scanf("%s",s)!=EOF) {
l=strlen(s);
printf("%s
",res[judge()]);
}
return 0;
}
题目地址:【CodeForces】[66A]Petya and Java
题意:
给出一个数字,要求输出它的数据类型
- 128~127为byte
- 32768~32767为short
- 2147483648~2147483647为int
- 9223372036854775808~9223372036854775807为long
其它的为BigInteger
解题过程:
因为数字的位数较大
所以可用字符串读取
除了BigInteger之外其它的都在__int64范围内
所以如果可以判断数字在- 9223372036854775808~9223372036854775807
则可转换为数字用__int64储存再进行进一步的范围判断
所以主要是判断是否是BigInteger
可根据位数进行初步判断
可知
字符串长度大于19的正数(s[0]!=’-’)及大于20的负数(s[0]==’-’)
一定为BigInteger
字符串长度小于19的正数(s[0]!=’-’)及小于20的负数(s[0]==’-’)
一定不为BigInteger
所以只需要判断等于的情况
则可建立一 “9223372036854775807” 字符串
令其与字符串比较即可进行判断