【CodeForces】[66A]Petya and Java

这里写图片描述

判断一个数的数据类型

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

原文地址:https://www.cnblogs.com/BoilTask/p/12569565.html