为什么循环不运行一次

问题描述 投票:0回答:2

给定一个适合 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;
}
c++
2个回答
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;
}

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
以强制进行浮点除法,并且应按预期进入循环。

尝试 godbolt.org

© www.soinside.com 2019 - 2024. All rights reserved.