Page 1 sur 2
Equation
Posté : 25 janv. 2007, 15:29
par Exp9
Bonjour,
Désolé par avance si je ne post pas dans le bon forum, voir le bon site.
Je cherche à résoudre une équation en php:
((x * 1000) + 50000 )%3 = 0
soit:
$iValue = 50000;
( ( $tofind * 1000 ) + $iValue ) % 3 = 0;
Si une personne à une idée

Posté : 25 janv. 2007, 15:42
par HD
tu es sur que c'est un "%" qu'il y a dans ton equation ? et donc c'est quoi %3 ???
Posté : 25 janv. 2007, 15:54
par exp9
le % veux dire modulo où "Le reste de la division" (existe en php); doc ->
http://fr2.php.net/operators.arithmetic
Donc :
echo 3 % 3; // Donne 0 en php car le reste de la division de 3/3 vaut 0;
echo 4 % 3; // Donne 1 en php car le reste de la division de 4/3 vaut 1;
Voila

Posté : 25 janv. 2007, 15:56
par Ryle
tu es sur que c'est un "%" qu'il y a dans ton equation ? et donc c'est quoi %3 ???
En principe c'est un Modulo
En gros, ca reviendrait à chercher les valeurs de x pour lesquelles ( $x * 1000 ) + $iValue ) est multiple de 3 ...
Mais sans bornes tu vas avoir une infinité de résultats, et je vois pas trop ce que tu veux obtenir... Si par contre tu as une valeur max pour $x, tu peux faire une boucle et tester tes résultats un par un... encore que ton équation doit pouvoir se simplifier puisque dès que tu as trouvé le premier $x qui convient (genre $x=1), tous les autres seront nécessairement multiples de $x+3
Posté : 25 janv. 2007, 16:07
par exp9
tu es sur que c'est un "%" qu'il y a dans ton equation ? et donc c'est quoi %3 ???
Oui c'est tout à fait çà.
J'avais effectivement utilisé une boucle (sans limite), mais je ne trouve vraiment pas çà propre et je pense qu'il est possible de résoudre le problème par une équation.
$x = 50000;
while($x%3!=0)
{
$x+=1000;
}
echo $x; // 51000
Posté : 25 janv. 2007, 16:23
par exp9
En gros, ca reviendrait à chercher les valeurs de x pour lesquelles ( $x * 1000 ) + $iValue ) est multiple de 3 ...
Désolé mauvais quote
Sinon pour apporter du sens:
[Ex: Sur une boutique en ligne qui vend des soldats de plomb]
1 sachet de soldat de plomb contient 3 soldats.
Les sachets sur le site ne se vendent que par tranche de 1000 sachet.
Seulement sur ce site, l'utilisateur ne saisit pas le nombre de sachet qu'il desire mais le nombre de soldat de plomb.
Donc si l'utilisateur saisie 50 000 soldat, mon code doit le corriger en toute logique à 51 000. (valeur logique superieur).
En esperant que cela soit plus clair.
Posté : 25 janv. 2007, 16:29
par Ryle
Mais c'est quoi concrêtement le problème ? trouver toutes les valeurs de $x qui conviennent ? tu en as une infinité !!
Tu peux simplifier en appliquant au préalable le modulo à chacun des éléments de ton équation. Je ne sais pas si c'est une règle, mais en tout cas c'est un constat
Personnellement je simplifierais ainsi :
<=> ((1000 * $x) + 50000) %3 = 0
<=> ((1000%3 * $x) + 50000%3) %3 = 0
1000 % 3 = 1
50000 % 3 = 1
<=> (1*$x + 1) % 3 = 0
<=> ($x+1)%3 = 0
Il te faut donc trouver toutes les valeurs de $x pour lesquelles $x+1 est multiple de 3.
Posté : 25 janv. 2007, 16:44
par Ryle
Ah ben oui, mais avec le contexte ca n'a plus rien à voir !!

C'est plus une equation à résoudre, c'est un nombre à calculer, et tu as effectivement des bornes !!
Ta boucle est limitée puisque tu vas au maximum ajouter 2 soldats pour obtenir un multiple de 3. Le code que tu as donné est donc très bien

Posté : 25 janv. 2007, 16:54
par Exp9
Ta boucle est limitée puisque tu vas au maximum ajouter 2 soldats pour obtenir un multiple de 3. Le code que tu as donné est donc très bien

Et bien pas forcément 2 soldats car dans le cas de 50000 soldats ce sera 1000 soldats de plus pour rester en cohérance avec la régle "les sachets sont vendu par tranche de 1000 (donc 1000*3 = par tranche de 3000 soldats"
La boucle marche effectivement bien, mais j'ai peur qu'il n'y ai pas de résultat possible pour un nombre donné et donc de tomber en boucle infinie.
Posté : 25 janv. 2007, 17:01
par Ajoloca
Bonjour,
Ceci devrait convenir.
<?php
$piecesPaquet = 3;
$paquetsSachet = 1000;
$commande = 50000;
$paquetsCmde = ceil($commande / ($piecesPaquet * $paquetsSachet));
echo 'A commander : ' . $paquetsCmde * $paquetsSachet * $piecesPaquet;
?>
Posté : 25 janv. 2007, 17:14
par Exp9
Merci Ajoloca, c'est parfaitement ce que je souhaitai. Me reste a comprendre comment ca marche réelement pour m'en souvenir.
Merci aussi Ryle.
Bonne journée.
Linkside
Posté : 25 janv. 2007, 17:26
par Ajoloca
Re,
ATTENTION:
Comme tu le vois aucun test n'est fait, il te faudra ajouter le cas ou la commande soit < à $paquetsSachet * $piecesPaquet, que tu devras forcer à cette valeur : $paquetsSachet * $piecesPaquet
Posté : 25 janv. 2007, 17:33
par orgerix
La je suis pas d'accord...
Normalement, $commande/($paquetsachet*$piecesachet) sera un double entre 0 et 1, donc la fonction ceil revera 1
Posté : 25 janv. 2007, 17:37
par Ajoloca
Re,
Je ne sais pas quelle est la précision (de plus elle ne doit être la même dans tous les systèmes).
Ma politique c'est, des que je peu contrôler un éventuel souci, je le fais sans laisser le hasard faire les choses.
De plus si l'utilisateur rentre en valeur de commande 0 (zéro) que se passera-t-il d'après toi ???

Posté : 25 janv. 2007, 17:42
par orgerix
Je ne comprend pas pourquoi le problème ne se pose que quand $commande < $paquetsSachet * $piecesPaquet
Si j'ia bien compris, tu dis que si $commande<<$paquetsSachet * $piecesPaquet, alors la fonction renverra 0.
Cependant, le problème se pose toujours si $commande-1000<<$paquetsSachet * $piecesPaquet, la fonction renverra 1...
Si l'utilisateur entre 0, la fonction renverra 0, ce qui est logique, vu qu'il ne commende rien...