给定一个适合 32 位有符号整数的正整数,找出它是否可以表示为 A^P,其中 P > 1 且 A > 0。 A 和 P 都应该是整数。
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int A = 4;
if (A == 1)
cout << 1;
else if (A < 4)
cout << 0;
int N;
for (int P = 2; 2 <= pow(A + 1, 1 / P); P++) {
N = pow(A, 1 / P);
if (pow(N, P) == A)
cout << 1;
}
return 0;
}
你犯了整数除法的错误。
1 / P
将 int
除以 int
,得到 int
结果。由于 P
大于 1,结果始终为 0,因此您的测试始终为 false。
如果
/
的至少一个操作数是 double
,则另一个将提升为 double
,您将得到小数结果。
int main() {
int A = 4;
if (A == 1)
cout << 1;
else if (A < 4)
cout << 0;
int N;
for (int P = 2; 2 <= pow(A + 1, 1.0 / P); P++) {
N = pow(A, 1.0 / P);
if (pow(N, P) == A)
cout << 1;
}
return 0;
}
循环一次都没有执行的主要问题在于循环条件及其中使用的表达式。具体来说,由于与整数除法和浮点精度相关的问题,
pow(A + 1, 1 / P)
的计算并未达到您的预期。
在C++中,当除法运算符
/
的两个操作数都是整数时,执行的除法是整数除法,它会丢弃任何余数并返回整数结果。因此,当 1 / P
时,0
将是 1 < P <= 2
,使得 pow(A + 1, 1 / P)
计算为 pow(A + 1, 0)
,无论 1
的值如何,它始终是 A
。这会导致条件 2 <= pow(A + 1, 1 / P)
在 A >= 3
时为假,因此循环不会运行。
要解决这个迫在眉睫的问题,无需完全更改循环条件,您可以将两次出现的
1 / P
更改为 1.0 / P
以强制进行浮点除法,并且应按预期进入循环。