为何判断整数是否为幂数的C++代码循环一次都不执行?
问题分析:循环为何一次都不执行
你的代码里循环完全不执行的核心原因是整数除法导致循环条件直接不成立,具体拆解如下:
1. 整数除法的隐形陷阱
在C++中,两个整数做除法时结果会自动截断为整数。你的循环条件里的1/P,其中P是int类型、初始值为2,1也是整数,所以1/2的结果是0,而非你预期的0.5。
2. 循环条件计算彻底错误
当A=4时,循环条件2 <= pow(A + 1, 1 / P)就变成了2 <= pow(5, 0)。任何数的0次方都是1,此时条件等价于2 <= 1,显然不成立,循环直接跳过,一次都不会执行。
额外隐患:浮点数精度问题
就算你把1/P改成1.0/P(让除法变为浮点数运算),用pow函数做判断依然有风险:浮点数的精度误差可能导致计算结果偏离真实值。比如当A=16、P=4时,pow(16, 1.0/4)可能因精度问题得到1.9999999999,转成int类型的N后变成1,此时pow(N,P)就不等于A,会出现误判。
修正方案示例
#include <cmath> #include <iostream> using namespace std; int main() { int A = 4; if (A == 1) { cout << 1; return 0; } if (A < 4) { cout << 0; return 0; } // P的上限设为log2(A),因为A^P >= 2^P,超过log2(A)后结果必然大于A int maxP = log2(A); for (int P = 2; P <= maxP; P++) { // 用二分法找整数N,避免浮点数精度问题 int left = 2, right = A; bool found = false; while (left <= right) { long long mid = left + (right - left) / 2; // 计算mid^P,用long long避免溢出 long long result = 1; bool overflow = false; for (int i = 0; i < P; i++) { if (result > A / mid) { // 提前判断溢出 overflow = true; break; } result *= mid; } if (overflow || result > A) { right = mid - 1; } else if (result == A) { found = true; break; } else { left = mid + 1; } } if (found) { cout << 1; return 0; } } cout << 0; return 0; }
内容的提问来源于stack exchange,提问作者Shreya Shree
相关产品推荐
相关产品推荐

