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

つかれた。遅いです。ここで間違いがどこにあるのかわかりません。また、10 進数がすべて 2 進数であるかどうかを調べるための数学のトリックがあれば、時間のかからない方法を見つけることができてうれしく思います。

4

5 に答える 5

1

コードの特定の問題に対する答え:

爆発()は、あなたが思っていることをしません。Explode() には区切りパラメータが必要であり、そのパラメータをセパレータとして使用して文字列を配列に分割します。コード内の expand() を 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

コードで 255 ではなく 225 を使用しています。

また、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 に答える