如何检查N是否可以用P ^ Q写入

时间:2015-05-22 08:03:49

标签: php

我需要检查是否给定数字N可以用P ^ Q写入,如果是,如果没有返回0则返回1。 例如,我的数字N = 27,因为它可以写成3 ^ 3,所以如果应该返回1 如果N = 14,因为它不能用P ^ q写入,它应该返回0

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

所以这是函数:

function isPQ($n, $try = null) {
    if($try == null) {
         $try = $n;
    }
    for($i=2; $i<$try; $i++) {
        $tmp = log($n,$i);
        if(is_int($tmp)) {
            return 1;
        }
     }
    return 0;
}

基本上这个函数试图找到$ n的对数,直到基础$ try

<强>更新

将if(is_int($ tmp)){更改为if(floor($ tmp)== $ tmp){

function isPQ($n, $try = null) {
    if($try == null) {
         $try = $n;
    }
    for($i=2; $i<$try; $i++) {
        $tmp = log($n,$i);
        if(floor($tmp)==$tmp) {
            return 1;
        }
     }
    return 0;
}

测试用例:

$time = microtime();
echo '"14" result: "'.isPQ(14).'"<br>';  //"14" result: "not possible"
echo '"27" result: "'.isPQ(27).'"<br>';  //"27" result: "3^3"
echo '"81" result: "'.isPQ(81).'"<br>';  //"81" result: "4^3"
echo '"121" result: "'.isPQ(121).'"<br>';//"121" result: "2^11"
echo '"144" result: "'.isPQ(144).'"<br>';//"144" result: "2^12"
echo microtime()-$time;                  //0.000128

自己测试:http://gottschalkya.bplaced.net/isPQ.php

答案 1 :(得分:0)

function checkPQ($n)
{ 
 $ret = false;

 $n = abs($n);
 if($n<2)
    $ret = true;
 for($i=2;$i<$n;$i++)
 {    
   for($j=2;$j<$n;$j++)
   {
      if(pow($i,$j) == $n)
           $ret = true;
   }
 }  
 return $ret;
}

fiddle

答案 2 :(得分:0)

对数可以解决您的问题。我认同。  我们的数字必须是p的幂的结果。 记录p ^ q = n,我们得到log(n)base q = p p和q介于1到9之间,且必须为int。

function isYourType(){
for($base=1;$base<=9;++$base){
   $l = log(n,base);
   if(ctype_digit($l)) return true;
 }
}

答案 3 :(得分:0)

使用它:

function hasCubeRoot($val) {
  $r = pow($val, 1/3); 
  return (int)(($r - (int)$r) == 0);
}