2017-05-29 4 views
0

J'utilise la bibliothèque GMP de php pour résoudre un problème de formulaire.Convertir GMP nombre entier à une somme de puissance de deux (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; 
} 

La variable $ aRessource est égale à: array (1,2,4,8);

donc ma fonction gmp_sum retourne 15.

Je veux créer un algorithme qui fait l'opération inverse, la fonction prend l'entier 15 et me retourne un tableau qui contient 1 2 4 8. Mais je ne savoir par où commencer.

Merci pour l'aide

Solution:

entier Décomposer puissance de 2 en php

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

Comment voulez-vous diviser 15 à 1 2 4 8 ?? pouvez-vous expliquer la sortie –

+0

@rahulpatel Honnêtement, je ne sais pas exactement moi-même, mais c'est l'inverse de ma fonction –

+0

J'ai édité avec la solution pour décomposer entier à la puissance de 2 somme –

Répondre

0

En supposant que vous voulez un tableau qui ajoute à la somme, vous voulez un revers de cette. Cette fonction suppose que vous avez une entrée parfaite, donc par exemple, 17 ne fonctionnera pas. Essayez-le.

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 ci-dessus est à des fins représentatives. Vous pouvez utiliser, 31, 63, 127 etc et cela fonctionnera toujours bien.

+0

Bro le code ne fonctionnera pas pour un nombre supérieur à 15 –

+0

Oui c'est un problème surtout pour un grand nombre gmp merci pour la réponse quand même –

+0

et son renvoi un tableau vide btw:/ –