首页 > 解决方案 > c中的反向整数给出溢出

问题描述

我正在用 c 语言解决 leetcode 中的反向整数问题。但是它在 sum=sum+rem*10; 行上给出了运行时错误。

runtime error: signed integer overflow: 964632435 * 10 cannot be represented in type 'int'

这是代码。

#define INT_MAX 2147483647
#define INT_MIN -2147483648

int reverse(int x){
    int sum=0,rem=0;
    int p;
    if(x > INT_MAX || x < INT_MIN){return 0;}
    if(x==0){return 0;}
    if(x<0){p=x;x=abs(x);}
    while(x%10==0){x=x/10;}

    while(x>0){
        rem=x%10;

        if(sum > INT_MAX || sum*(-1) < INT_MIN){return 0;}        
        sum=sum*10+rem;

        x/=10;
    }
    if(p<0){sum=sum*(-1);return sum;}
    else{return sum;}
}

标签: c

解决方案


一种方法 - 不是性能最佳但简单 - 是将整数转换为字符串,然后还原字符串,然后再转换回整数。

以下解决方案适用于整数 - 我将把它留给 OP 来扩展它以处理负整数。

可能看起来像:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

int reverse(const int n)
{
    if (n < 0)
    {
        printf("Handling of negative integers must be added\n");
        exit(1);
    }

    char tmp1[100];
    char tmp2[100] = { 0 };
    sprintf(tmp1, "%d", n);
    printf("Input : %s\n", tmp1);
    size_t sz = strlen(tmp1);
    for (size_t i = 0; i < sz; ++i)
    {
        tmp2[i] = tmp1[sz-i-1];
    }

    int result = tmp2[0] - '0';
    char* p = tmp2+1;
    while(*p)
    {
        if ((INT_MAX / 10) < result)
        {
            printf("oh dear: %d can't be reversed to int\n", n);
            exit(1);
        }
        result = result * 10;
        if ((INT_MAX - (*p - '0')) < result)
        {
            printf("oh dear: %d can't be reversed to int\n", n);
            exit(1);
        }
        result += *p - '0';

        p++;
    }

    return result;
}

int main()
{
    printf("Output: %d\n", reverse(123));
    printf("Output: %d\n", reverse(123456789));
    printf("Output: %d\n", reverse(1234567899));
    return 0;
}

输出:

Input : 123
Output: 321
Input : 123456789
Output: 987654321
Input : 1234567899
oh dear: 1234567899 can't be reversed to int

推荐阅读