为什么会出现运行时错误?我把range2
做了很长时间。
代码:
/*VARIABLES FOR WHILE LOOP*/
long long range1 = 9;
int length = 1;
/*FIND NUM'S LENGTH*/
while (NUM > range1)
{
long long range2 = range1 * 10 + 9;
length += 1;
}
错误:
credit.c:25:25:运行时错误:有符号整数溢出:999999999 * 10无法用'int'类型表示
答案 0 :(得分:1)
您的代码存在(两个)主要问题,这两个问题都会导致相同的错误:
int length
变量正在增加到达到最大值的位置。
这是你的循环:
while (NUM > range1)
{
long long range2 = range1 * 10 + 9;
length += 1;
}
这个最大的问题是这个while循环永远不会结束。您永远不会在while循环中更改NUM
或range1
的值,因此如果NUM
的开头大于range1
,您将陷入无限循环。在length += 1
整数达到max allowed int值之前,length
将一直被调用。
根据您解决问题#1的方式,您还可能遇到以下问题。
正如您在上述评论中所述,NUM
是信用卡号。
int
变量的最大值是999999999 *
10,最多10位数。如果你的循环被设置为运行NUM
次的值,直到它达到9.如果我们假设选择尽可能低的16位信用卡号码1000000000000000,你的循环仍然会运行{{1} }次。
每次循环运行时,1000000000000000 - 9
增加1.循环基本上会尝试将int变量增加至少999999999999991次,这将导致该值大于999999999 * 10.
在您的问题中没有足够的细节来确定这是否可以解决您的问题,但我会猜测而不是
length
你可能想写
long long range2 = range1 * 10 + 9;
答案 1 :(得分:1)
您可以尝试使用此方法来满足上述条件
使用两种最常见的表示形式,范围是0到4,294,967,295(2 ^ 32-1)以表示为一个(无符号)二进制数,范围是-2,147,483,648(-2 ^ 31)到2,147,483,647(2 ^ 31 − 1)表示为二进制补码
我最近在解决一个有约束的问题时遇到了它
给出一个32位带符号整数,整数的倒数
运行时错误:有符号整数溢出:999999999 * 10不能用'int'类型表示
所以,这是我的代码
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
在我获得999999999 * 10之前,rev> INT_MAX它保证了溢出,反之亦然。
答案 2 :(得分:-1)
unsigned int 的大小为(0 到 4,294,967,295)4 个字节;
所以 999999999 *10 大于 4,294,967,295
因此尝试使用 (long)
long long int x=999999999 *10 (try this...)