PHP:225的最小倍数,即1和0

时间:2013-03-28 05:56:39

标签: php

echo "The smallest multiple of 225 that is only 1's and 0's is: ";

$multiple = (integer) 225;
$factor = (integer) 1;

while (!isDecimalBinary($multiple))
{
   $multiple += 225;
   $factor += 1;
}  

 echo $multiple.':'.$factor;


function isDecimalBinary($number)
    {
       $stringNumber = (string) $number;
       $arrayNumber = str_split($stringNumber); 
       foreach ($arrayNumber as $item)
       {
          if ($item != '0' || $item != '1')
          {
             return FALSE;
          }
       }
       return TRUE;
    }

我累了。晚了。我无法想象这里的错误在哪里。 此外,如果有任何数学技巧可以找到十进制数是否都是二进制数字,我很高兴能找到一种耗时较少的方法。

5 个答案:

答案 0 :(得分:1)

您的代码的具体问题的答案:

explode()不会按照您的想法执行。 explode()需要一个delimeter参数,并使用该参数作为分隔符将字符串拆分为数组。如果使用str_split()替换代码中的explode(),它只是将字符串转换为字符数组,则该函数可以正常工作。

http://www.php.net/manual/en/function.str-split.php

http://www.php.net/manual/en/function.explode.php


现在,这实际上并没有解决你的问题,因为你要等很长时间才能通过PHP来强制执行这样的正确答案。你知道如何在PHP中运行调试器,对吧?通过循环进行调试,看看效率是多么低效。例如,当你达到2250时,你可以在没有任何计算的情况下知道答案不可能小于10,000,但是你会继续检查所有不能以1开头的介入值。

很快就会发现这不是正确的做法。如果你以相反的方式看问题怎么办,并检查仅包含1和0的数字,看看它们是否是255的倍数?

更新了解决方案(http://phpfiddle.org/main/code/dmw-zif

$i = 1;
$val = $i;
while ($val % 255)
{
  $bin = decbin($i++);
  $val = (integer) $bin;
}  

echo "The smallest multiple of 255 that is only 1's and 0's is: $val, which is equal to 255 *".($val/255);

答案 1 :(得分:0)

您的代码中使用的是225而不是255。

您也可以使用str_split($stringNumber, 1)代替explode($stringNumber)

答案 2 :(得分:0)

你忘了这里爆炸参数

$arrayNumber = explode($explode_parameter,$stringNumber); 

答案 3 :(得分:0)

您的功能未正确调用explode(),如果没有分隔符,则无法调用它。您可以使用str_split()代替,但它可以更简单:

function isDecimalBinary($number)
{
        return strspn($number, '01') == strlen($number);
}

顺便说一下,这段代码需要64位整数,否则它们会变成双精度并失去精度。

或者,您可以使用gmp

$multiple = gmp_init(225);
$factor = 1;

$result = $multiple;

while (!isDecimalBinary(gmp_strval($result))) {
    ++$factor;
    $result = gmp_add($result, $multiple);
}

echo gmp_strval($result).':'.$factor;

答案 4 :(得分:0)

function isDecimalBinary($number)
{
    return $number == base_convert(base_convert($number,2,10),10,2);
}

将其转换为基数10(如果不是基数2则精确损失)然后返回2.如果它们不同,则不是全部为1和0。