【LeetCode】检查一个10位数组,是否溢出int类型的数据

检查一个10位数组,是否溢出int类型的数据

3种方法:

1.检查后9位

2.检查前9位

3.用long类型计算结果 然后比较

    //检验10位大小溢出问题————long类型
    long result = 0;        //##定义为long类型
    for(i=0;i<len;i++)
        result = result*10 +s[i] ;      //## 数组->整数 
    printf("%ld\n",result);

    if(sign==1 && result > INT_MAX)
        return INT_MAX;
    else if(sign==-1 && result-1 > INT_MAX) //##result-1>INT_MAX 否则溢出--> INT_MAX+1
        return INT_MIN;
    return result;


    //检验10位大小溢出问题
    //法1:int类型,
    //判断 后9位 ? INT_MAX的后9位
    //len>10  溢出
    //len==10,  最高位>2时,溢出
                最高位==2时,正数result>INT_MAX-2000000000溢出
                            负数result>INT_MAX-2000000000+1溢出                            
    if(len==10)
    {
        if(s[0] > 2)
        {
            flag = -1;
        }
        if(s[0]==2)
        {
            for(i = len-1;i>=1;i--)
            {
                result += s[i]*times;
                times *=10;            
            }
            if(symbol==-1 && result>INT_MAX-2000000000+1)
                flag = -1;
            if(symbol== 1 && result>INT_MAX-2000000000)
                flag = -1; 
        }
    }
    
    //法2:在相加的时候就比较大小
    //判断 前9位 ? INT_MAX的前9位
        if(sign==1&&(INT_MAX/10<ans || (INT_MAX/10==ans&&INT_MAX%10<=tmp)))
            return INT_MAX;
        else if(sign==-1&&(-(INT_MIN/10)<ans || (-(INT_MIN/10)==ans&&-(INT_MIN%10)<=tmp)))
            return INT_MIN;
        for(i = 0;i<len;i++)
        {
            if(i == 9)
            {
                if(sign==1)
                    if( result>INT_MAX/10 || (result==INT_MAX/10 && s[i]>=INT_MAX%10))//溢出
                        return 0;
                if(sign==-1)
                    if( result>INT_MAX/10 || (result==INT_MAX/10 && s[i]>=INT_MAX%10+1))//溢出
                        return 0;                
            }
            result = result*10 +s[i];
        }
    //法3:用long类型计算结果,然后比较与INT_MAX的大小
    //最简单



猜你喜欢

转载自blog.csdn.net/qq1518572311/article/details/80340606
今日推荐