对于给定的整数 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
、-3
和 0
。 (从技术上讲,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;
}
这是我尝试过的方法,但它给了我错误的输出。谁能指出错误是什么?
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
、-3
和0
。 (从技术上讲,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;
}