c - 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;}
}
解决方案
一种方法 - 不是性能最佳但简单 - 是将整数转换为字符串,然后还原字符串,然后再转换回整数。
以下解决方案适用于正整数 - 我将把它留给 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
推荐阅读
- windows-10 - 从命令行启动“将文件类型或协议与程序关联”应用程序
- ios - 将 UIViews 放在前面
- bash - 用于更新最后一个字符的 Bash 脚本
- azure-active-directory - 在 Azure AD B2C 中刷新令牌吊销
- reactjs - 在 react-bootstrap@1.0.0-beta.5 中渲染 Nav.Link 时出错
- java - java: super 必须是构造函数中的第一个
- google-docs-api - 将信息从侧边栏移动到光标位置
- opengl - Embarcadero Windows 库和包
- python - Python 随机跳过循环迭代
- css - 使用 -webkit-overflow-scrolling 拖动元素顶部的元素会导致底层元素滚动