求助:判断质因数仅含2、3、5的代码出现signed integer overflow错误
解决质因数检查程序的整数溢出问题
错误原因
报错的核心问题是:当输入的n为int类型的最小值(-2147483648)时,执行n = n * (-1)会触发有符号整数溢出。因为int类型的取值范围是-2147483648到2147483647,-2147483648取反后得到的2147483648超出了int的最大值,无法被存储,从而引发运行时错误。
另外,原代码还存在逻辑漏洞:负数的质因数必然包含-1,不符合“仅含2、3、5”的要求;同时未处理n=0的情况(0没有质因数,也不符合条件)。
修复后的代码
bool check(int n) { // 负数、0直接返回false,无需后续处理 if (n <= 0) return false; // 反复除以2,直到无法整除 while (n % 2 == 0) n /= 2; // 反复除以3,直到无法整除 while (n % 3 == 0) n /= 3; // 反复除以5,直到无法整除 while (n % 5 == 0) n /= 5; // 最终结果为1,说明所有质因数只有2、3、5 return n == 1; }
关键修改点
- 移除负数转正数逻辑:直接判定负数不符合条件,从根源避免了整数溢出问题。
- 简化循环逻辑:用三个独立的while循环分别处理2、3、5的整除操作,去掉了冗余的
count变量,代码更直观。 - 补充边界处理:新增
n<=0的判断,覆盖了0和负数的特殊情况。
内容的提问来源于stack exchange,提问作者Uday Kiran
相关产品推荐
相关产品推荐

