对于给定的整数 Z,检查 Z 是否可以写成 P^Q,其中 Q 和 P 是正整数

For a given integer Z, check if Z can be written as P^Q where Q and P are positive integers

这是我尝试过的方法,但它给了我错误的输出。谁能指出错误是什么?

function superPower($n) {
    $response = false;
    $n = abs($n);
    if ($n < 2) { 
       $response = true;
    }
    for ($i=2;$i<$n;$i++) {    
        for ($j=2;$j<$n;$j++) {
            if (pow($i,$j) == $n) {
                $response = true;
            }
        }
    }  

    return $response;   
}

例如,如果我给它编号 25,它会给出 1 作为输出。 //正确的 但是如果我给它 26 它仍然给我 1 这是错误的。

通过使用 superPower,您实质上是在尝试对攻击的威力进行一定的防御,以查看它是否经得起考验。与您现在使用的蛮力方法相比,这可以更有效地完成。

function superPower( $hp) { // Niet used Superpower!
    if( $hp <= 1) return true;

    for( $def = floor(sqrt($hp)); $def > 1; $def--) { // Niet's Defence fell
        for( $atk = ceil(log($hp)/log($def)); $atk > 1; $atk--) { // Niet's Attack fell
            if( pow($def,$atk) == $hp) return true;
            break;
            // you don't need the $atk loop, but I wanted to make a Pokémon joke. Sorry.
        }
        // in fact, all you really need here is:
        // $atk = log($hp)/log($def);
        // if( $atk-floor($atk) == 0) return true;
    }
    return false;
}

已接受答案的数学绝对精彩,但解决方案存在几个问题:

  • 函数错误地 returns true 用于以下所有输入:monkey-30。 (从技术上讲,0 是无符号的,因此无法通过将一个正整数乘以另一个正整数的幂来获得它。对于任何负输入也是如此。)

  • 函数将浮点数与整数(floor()ceil()returnfloat)进行比较,应该像瘟疫一样避免。要了解原因,请尝试 运行 php -r '$n = (-(4.42-5))/0.29; echo "n == {$n}\n".($n == 2 ? "OK" : "Surprise")."\n";'

以下解决方案通过解决上述所有问题改进了这个想法:

function superPower($value)
{
    // Fail if supplied value is not numeric
    if (!is_numeric($value)) {
        // throw new InvalidArgumentException("Value is not numeric: $value");
        return false;
    }

    // Normalise numeric input
    $number = abs($value);

    // Fail if supplied number is not an integer
    if (!is_int($number)) {
        // throw new InvalidArgumentException("Number is not an integer: $number");
        return false;
    }

    // Exit early if possible
    if ($number == 1) {
        // 1 to the power of any positive integer is one
        return true;
    } elseif ($number < 1) {
        // X to the power of Y is never less then 1, if X & Y are greater then 0
        return false;
    }

    // Determine the highest logarithm base and work backwards from it
    for ($base = (int) sqrt($number); $base > 1; $base--) {
        $coefficient = log($number)/log($base);

        // Check that the result of division is a whole number
        if (ctype_digit((string) $coefficient)) {
            return true;
        }
    }

    return false;
}