2
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;
    }

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

4

5 回答 5

1

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

explode() 不会做你认为它做的事。explode() 需要一个分隔符参数,并使用该参数作为分隔符将字符串拆分为数组。如果将代码中的explode() 替换为str_split(),它只是将字符串转换为字符数组,则该函数可以正常工作。

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);
于 2013-03-28T06:23:27.097 回答
0

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

此外,您可能想要使用str_split($stringNumber, 1)而不是explode($stringNumber)

于 2013-03-28T06:00:09.397 回答
0

你忘了这里爆炸参数

$arrayNumber = explode($explode_parameter,$stringNumber); 
于 2013-03-28T06:00:16.527 回答
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;
于 2013-03-28T06:06:42.057 回答
0
function isDecimalBinary($number)
{
    return $number == base_convert(base_convert($number,2,10),10,2);
}

将其转换为以 10 为底(如果不是以 2 为底,则精度损失)然后返回 2。如果它们不同,则不全是 1 和 0。

于 2013-03-28T06:13:40.397 回答