为什么会出现运行时错误?我把range2
设置为long long。
代码:
/*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;
}
错误:
信用卡.c:25:25:运行时错误:有符号整数溢出:999999999 * 10不能用类型“int”表示
4条答案
按热度按时间k3fezbri1#
你可以试试这一款来处理以上情况
我最近在解决一个有约束条件的问题时遇到了这个问题
给定一个32位有符号整数,将整数的数字反转
运行时错误:有符号整数溢出:999999999 * 10不能在类型'int'中表示
这是我的代码
在我得到99999999 *10,rev〉INT_MAX之前,它保证了OVERFLOW,反之亦然。
rkue9o1l2#
你的代码有两个主要问题,这两个问题都会导致相同的错误:
int
length
变量将增加到它达到最大值的点。下面是while循环:
问题#1
最大的问题是这个while循环永远不会结束。你永远不会在while循环中更改
NUM
或range1
的值,所以如果NUM
开始时大于range1
,你将陷入无限循环。length += 1
将继续被调用,直到length
整数达到允许的最大int值。(可能)问题#2
根据您解决问题#1的方式,您还可能面临以下问题。
正如你在上面的评论中所说,
NUM
是一个信用卡号码。int
变量的最大值为99999999 * 10,最大为10位数。如果你的循环被设置为运行
NUM
次,直到它达到9。如果我们假设选择最低的16位信用卡号码,10000000000000,你的循环仍然会运行1000000000000000 - 9
次。每次循环运行时,
length
都会增加1。循环将尝试将int变量增加至少999999999999991次,这将导致值大于999999999 * 10。(可能)修复
你的问题中没有足够的细节来确定这是否能解决你的问题,但我会猜测,而不是
你可能是想写
5ktev3wc3#
你必须仔细阅读这个问题,因为在一些问题中,输入/输出是有符号的32位整数或无符号的32位整数,两者都有不同的范围,因此范围之外的值无效,或者你必须返回0,就像下面一样。返回x的数字反转。如果反转x导致值超出有符号32位整数范围[-231,231 - 1],则返回0。
假设环境不允许存储64位整数(有符号或无符号)。Solution
4xy9mtcn4#
unsigned int的大小为(0到4,294,967,295),为4个字节;
所以999999999 *10大于4,294,967,295,因此尝试使用(long)