2013-03-28 35 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。

相關問題