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