2017-05-29 14 views
0

私は処方箋の問題を解決するためにPHPのGMPライブラリを使用しています。GMP整数を2の累乗(2n)の和に変換する

public function gmp_sum($aRessource) 
{ 
    // Avec le while 
    $i = 0; 
    $nb_ressource = count($aRessource); 
    while ($i < $nb_ressource) 
    { 
     if ($i == 0) 
     { 
      $tmp = gmp_init($aRessource[$i]); 
     } 
     else 
     { 
      $tmp = gmp_add(gmp_init($aRessource[$i]),$tmp); 
     } 
     $i++; 
    } 
    return $tmp; 
} 

変数$ aRessourceは次のものと同じです。array(1,2,4,8);ので、私の関数gmp_sum 15.私は逆の操作を行うアルゴリズムを作成したい

を返して

、関数は整数15を取ると私の2 4 8 1を含む配列を返します。しかし、私はしないでくださいどこから始めるべきかを知るヘルプ

ソリューションのための

ありがとう:PHPで2

public function gmp_reverse($gmp_sum) 
{ 
    $res = array(); 
    $i = 1; 
    while ($i < 64) // 64 bytes 
    { 
     $tmp = $gmp_sum & $i; // check if bytes equal to 1 
     if ($tmp != 0) 
     { 
      array_push($res,$i); 
     } 
     $i = $i * 2; 
    } 
    return $res; 
} 
+0

15を1に分割する方法2 4 8 ??私は出力を説明することができます –

+0

@rahulpatel正直に私は自分自身を知っていませんが、私の関数の逆です –

+0

整数の2の和の整数に分解するソリューションを編集しました –

答えて

0

のパワーに

デコンポーズ整数を使用すると、合計に足し配列をしたいと仮定すると、あなたはの逆をしたいですそれ。この関数は完全な入力を持っていると仮定しています。たとえば、17は機能しません。 試してみてください。

function reversegen($gmpsum) 
{ 
    $stack = array(); 
    $limit = $gmpsum; 
    $cur = 1; 
    for($sum = 0; $sum < $limit;) 
    { 
     echo $cur. "<br>"; 
     array_push($stack,$cur); 
     $sum = $sum + $cur; 
     $cur = 2 * $cur; 
    } 
    return($stack); 
} 


$stack = reversegen(15); 
print_r($stack); 

15は代表的なものです。あなたは、31、63、127などを使用することができ、それでも正常に動作します。

+0

コードは任意の数より大きい15 –

+0

はいそれは大きな数字のgmpのための特に問題です。とにかく答えをどうもありがとうと –

+0

とその空の配列を返すbtw:/ –

関連する問題