par
sirakawa » 17 nov. 2011, 12:50
si tu utilises l'alphabet complet tu es en base 35 qui est la plus grande base que PHP sait gérer...
facile à vérifier
base 2 se sert de 0 et 1 où 35 se noterait : 100011
de droite à gauche
1: (2^0)*1
2 : (2^1)*1
0 : (2^2)*0
0: (2^3) *0
0 : (2^4)*0
32 : (2^5)*1
base 10 :35 se note 35
5 : (10^0)*5
3: (10^1)*3
base 16 :
10 se note 0A ou 0a, 15 OF et 16: 10
Il te faut six symboles de plus qu'en base 10, ou, si tu préfères, autant de symboles que le nombre de ta base
L'erreur doit venir de ma programmation. Il se trouve que mon texte trainait encore dans mon éditeur, et que je m'amusais à le modifier pour le généraliser:
/*
* (c) Michel Barthélémy Billard Sirakawa 11/2011
* GPL
*function operations: do any operation between two numbers in any base from 2 to 35.
* parameters :
* mandatory
* $operateur : string: the operation to be done : *,/,+,*
* $operande_1 : string : first number
* $operande_2 string the secund number
* $base_1 integer: the base in which the first number is wtiten
* $resultat var in which the result is put
* optional
* $base_2 integer : the base in which the secund number is writen
* if no base_2 is given, $base_2 is assumed to be the same as $base_1
* $base_retour : integer : the base in which the result has to be writen; default = $base_1
* returns: THE BASE IN WHICH THE RESULT IS WRITEN
* exécute les quatre opérations entre deux nombres qui peuvent être de bases différentes entre 2 et .35 et retourne le résultat
* dans toute base entre 2 et 35
* parametres :
* obligatoires
* $operateur : string: opération à faire : *,/,+,*
* $operande_1 : string : premier nombre
* $operande_2 string : deuxième nombre
* $base_1 integer: base du premier nombre
* $resultat variable où le résultat est écrit
* optionnels
* $base_2 integer : base du deuxième nombre, non fournie, égale à $base_1
* $base_retour : integer : base du résultat, non fournie, égale à $base_1
* retourne : la base dans laquelle le résultat est écrit.
*/
function operations ($operateur, $operande_1, $operande_2, $base_1, &$resultat, $base_2 = "", $base_retour = "")
{
$base_2 = ($base_2 == "")? $base_1: $base_2;
$base_retour = ($base_retour == "") ? $base_1: $base_retour;
$a = intval ($operande_1, $base_1);
$b = intval ($operande_2, $base_2);
$alerte = $base_retour;
switch ($operateur)
{
case "*":
$c = $a * $b;
$resultat = base_convert ($c, 10, $base_retour);
break;
case "/":
$resultat = floatval ($a) / floatval ($b);
$alerte = 10;
break;
case "+":
$c = $a + $b;
$resultat = base_convert ($c, 10, $base_retour);
break;
case "-":
$c = $a - $b;
$resultat = base_convert ($c, 10, $base_retour);
break;
}
return $alerte;
}
$a = "aaaa0000";
$b = "aaab0000";
$c = ""; // impératif de déclarer la variable qui contiendra le résultat
$base_result = operations ("-",$b, $a, 35, $c);
print "$b - $a = $c en base $base_result";
$base_result = operations("/", $a, $b, 35, $c, "",10);
print "<br>$b / $a = $c en base $base_result";
si tu utilises l'alphabet complet tu es en base 35 qui est la plus grande base que PHP sait gérer...
facile à vérifier
base 2 se sert de 0 et 1 où 35 se noterait : 100011
de droite à gauche
1: (2^0)*1
2 : (2^1)*1
0 : (2^2)*0
0: (2^3) *0
0 : (2^4)*0
32 : (2^5)*1
base 10 :35 se note 35
5 : (10^0)*5
3: (10^1)*3
base 16 :
10 se note 0A ou 0a, 15 OF et 16: 10
Il te faut six symboles de plus qu'en base 10, ou, si tu préfères, autant de symboles que le nombre de ta base
L'erreur doit venir de ma programmation. Il se trouve que mon texte trainait encore dans mon éditeur, et que je m'amusais à le modifier pour le généraliser:
[php]/*
* (c) Michel Barthélémy Billard Sirakawa 11/2011
* GPL
*function operations: do any operation between two numbers in any base from 2 to 35.
* parameters :
* mandatory
* $operateur : string: the operation to be done : *,/,+,*
* $operande_1 : string : first number
* $operande_2 string the secund number
* $base_1 integer: the base in which the first number is wtiten
* $resultat var in which the result is put
* optional
* $base_2 integer : the base in which the secund number is writen
* if no base_2 is given, $base_2 is assumed to be the same as $base_1
* $base_retour : integer : the base in which the result has to be writen; default = $base_1
* returns: THE BASE IN WHICH THE RESULT IS WRITEN
* exécute les quatre opérations entre deux nombres qui peuvent être de bases différentes entre 2 et .35 et retourne le résultat
* dans toute base entre 2 et 35
* parametres :
* obligatoires
* $operateur : string: opération à faire : *,/,+,*
* $operande_1 : string : premier nombre
* $operande_2 string : deuxième nombre
* $base_1 integer: base du premier nombre
* $resultat variable où le résultat est écrit
* optionnels
* $base_2 integer : base du deuxième nombre, non fournie, égale à $base_1
* $base_retour : integer : base du résultat, non fournie, égale à $base_1
* retourne : la base dans laquelle le résultat est écrit.
*/
function operations ($operateur, $operande_1, $operande_2, $base_1, &$resultat, $base_2 = "", $base_retour = "")
{
$base_2 = ($base_2 == "")? $base_1: $base_2;
$base_retour = ($base_retour == "") ? $base_1: $base_retour;
$a = intval ($operande_1, $base_1);
$b = intval ($operande_2, $base_2);
$alerte = $base_retour;
switch ($operateur)
{
case "*":
$c = $a * $b;
$resultat = base_convert ($c, 10, $base_retour);
break;
case "/":
$resultat = floatval ($a) / floatval ($b);
$alerte = 10;
break;
case "+":
$c = $a + $b;
$resultat = base_convert ($c, 10, $base_retour);
break;
case "-":
$c = $a - $b;
$resultat = base_convert ($c, 10, $base_retour);
break;
}
return $alerte;
}
$a = "aaaa0000";
$b = "aaab0000";
$c = ""; // impératif de déclarer la variable qui contiendra le résultat
$base_result = operations ("-",$b, $a, 35, $c);
print "$b - $a = $c en base $base_result";
$base_result = operations("/", $a, $b, 35, $c, "",10);
print "<br>$b / $a = $c en base $base_result";
[/php]