Equation

Exp9
Invité n'ayant pas de compte PHPfrance

25 janv. 2007, 15:29

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 :)

HD
Mammouth du PHP | 1181 Messages

25 janv. 2007, 15:42

tu es sur que c'est un "%" qu'il y a dans ton equation ? et donc c'est quoi %3 ???
"Si Dieu descendait sur la Terre, tous les peuples se mettraient a genoux, excepte les Français qui diraient : " Ah ! Vous êtes la ! C'est pas trop tôt ! On va pouvoir discuter un peu !" [Michel Balfour]

exp9
Invité n'ayant pas de compte PHPfrance

25 janv. 2007, 15:54

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 :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 janv. 2007, 15:56

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
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

exp9
Invité n'ayant pas de compte PHPfrance

25 janv. 2007, 16:07

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

exp9
Invité n'ayant pas de compte PHPfrance

25 janv. 2007, 16:23

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 janv. 2007, 16:29

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.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 janv. 2007, 16:44

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Exp9
Invité n'ayant pas de compte PHPfrance

25 janv. 2007, 16:54

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.

ViPHP
ViPHP | 1961 Messages

25 janv. 2007, 17:01

Bonjour,

Ceci devrait convenir.
<?php
	$piecesPaquet = 3;
	$paquetsSachet = 1000;
	$commande = 50000;
	$paquetsCmde = ceil($commande / ($piecesPaquet * $paquetsSachet));
	echo 'A commander : ' . $paquetsCmde * $paquetsSachet * $piecesPaquet;
?>
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Exp9
Invité n'ayant pas de compte PHPfrance

25 janv. 2007, 17:14

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

ViPHP
ViPHP | 1961 Messages

25 janv. 2007, 17:26

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
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 693 Messages

25 janv. 2007, 17:33

La je suis pas d'accord...

Normalement, $commande/($paquetsachet*$piecesachet) sera un double entre 0 et 1, donc la fonction ceil revera 1

ViPHP
ViPHP | 1961 Messages

25 janv. 2007, 17:37

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 ??? :?: :?: :?:
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 693 Messages

25 janv. 2007, 17:42

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...