【CodeForces】[66A]Petya and Java

文章字数:662

问题描述

问题分析

判断一个数的数据类型

除了BigInteger之外其它的都可以直接判断
所以主要是判断是否是BigInteger
可根据位数
那么只需要判断位数与边界值位数相同的情况

其余的就是一些小技巧了

 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
#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” 字符串
令其与字符串比较即可进行判断

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

加载中...