2013-03-28 34 views
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; 
    } 

我累了。晚了。我无法确定错误在哪里。 另外,如果有任何数学技巧来查找十进制数是否都是二进制数字,我会很高兴找到一种耗时较少的方法。PHP:225的全部1和0的最小倍数

+0

$ arrayNumber =爆炸($ stringNumber);你在哪个基础上爆炸? – Arvind 2013-03-28 06:00:33

+1

你知道它不能是255,765等。所以从510开始,一次增加510。 – 2013-03-28 06:01:26

+0

http://ideone.com/21baui – Musa 2013-03-28 06:09:23

回答

1

答案与你的代码的特定问题:

爆炸()不会做你认为它。 explode()需要一个delimeter参数,并将该字符串拆分为使用该参数作为分隔符的数组。如果用str_split()代替代码中的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); 
+0

这给了我一个白页。 – user 2013-03-28 06:29:05

+0

1000110(二进制)= 70(十进制),而不是71。此外,既没有十进制数是255的倍数,它们也不只由一和零的。 – Herbert 2013-03-28 06:38:06

+0

我不知道为什么你会得到从代码中的错误,它运行在我的本地系统和phpfiddle罚款。我在答案中将phpfiddle与解决方案的更新版本链接起来。 – AmericanUmlaut 2013-03-28 08:02:13

0

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

可能还需要使用str_split($stringNumber, 1)代替explode($stringNumber)

+0

谢谢你指出。但这并不影响真正的问题。 – user 2013-03-28 06:02:47

0

你忘了这里爆炸参数

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

在这种情况下,'$ explode_parameter'应该是空字符串,但并不在PHP :) – 2013-03-28 06:22:17

+0

善于观察工作,但我真的需要一个str_split() – user 2013-03-28 06:47:27

+0

@ 123你甚至都不需要'str_split() '或者实际上是一个循环;另见我的答案。 – 2013-03-28 06:48:31

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; 
0
function isDecimalBinary($number) 
{ 
    return $number == base_convert(base_convert($number,2,10),10,2); 
} 

将它转换为10进制(精度损失,如果不是基地2)然后回到2。如果他们是不同的,它不是所有的1和0。

相关问题