GitBook

这里写图片描述

判断一个数的数据类型

除了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\n",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” 字符串 令其与字符串比较即可进行判断