Un probleme en PHP
Résolu
imrane555
Messages postés
257
Date d'inscription
Statut
Membre
Dernière intervention
-
imrane555 Messages postés 257 Date d'inscription Statut Membre Dernière intervention -
imrane555 Messages postés 257 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
j'ai un problème qui dit :
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
et comme algorithme j'ai trouvé un truc qui ressemble un peu au bon prix :
Mais ce dernier me retourne 0 je sais que le probleme est dans la confusion entre l'array ($UnAVingt) et le While mais je sais pas vraiment comment faire pour gérer ca SVP me donnez pas la réponse au probleme ou une autre solution je veux juste que vous m'aidiez à réparer mon code
Merci .
j'ai un problème qui dit :
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
et comme algorithme j'ai trouvé un truc qui ressemble un peu au bon prix :
<?php
$r=0;
foreach (range(0, 20) as $UnAVingt);
while ($r % $UnAVingt != 0){
$r=$r+1; }
echo $r ;
?>
Mais ce dernier me retourne 0 je sais que le probleme est dans la confusion entre l'array ($UnAVingt) et le While mais je sais pas vraiment comment faire pour gérer ca SVP me donnez pas la réponse au probleme ou une autre solution je veux juste que vous m'aidiez à réparer mon code
Merci .
A voir également:
- Un probleme en PHP
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour a la ligne php - Forum Webmastering
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
3 réponses
Salut
Tu ne peut pas diviser par 0 tout simplement, c'est impossible
Etant donné que tu souhaite trouver par toi même, je t'en dit pas plus
--
Tu ne peut pas diviser par 0 tout simplement, c'est impossible
Etant donné que tu souhaite trouver par toi même, je t'en dit pas plus
--
Oui c'est absolument possible de trouver la réponse, ne sous-estime surtout pas la puissance de php!
Maintenant, il ne s'agit que d'être logique histoire de ne pas trop encombrer le script de calculs inutiles. On dit que 2520 est le plus petit nombre divisible de 1 à 10 sans reste, alors c'est absurde et incohérent de croire que la réponse se trouvera sous cette base.
Je possède avec moi un échantillon de code que j'ai réalisé pour lequel la seule contrainte - il me semble - est le temps maximal d'exécution. Il est à toi de me dire si tu veux que je le partage! ;)
Maintenant, il ne s'agit que d'être logique histoire de ne pas trop encombrer le script de calculs inutiles. On dit que 2520 est le plus petit nombre divisible de 1 à 10 sans reste, alors c'est absurde et incohérent de croire que la réponse se trouvera sous cette base.
Je possède avec moi un échantillon de code que j'ai réalisé pour lequel la seule contrainte - il me semble - est le temps maximal d'exécution. Il est à toi de me dire si tu veux que je le partage! ;)
Je viens de comprendre réellement le problème je me penche dessus !
Je confirme PHP est bien plus puissant que ce l'on peut croire, surtout avec les dernière versions, sont gros problème est d'^tre un langage interprété qui le rend bien lourd pour certaines taches comme celle ci !
EDIT :Réussi quasi instantané pour les nombres de 1 à 10 !
Je confirme PHP est bien plus puissant que ce l'on peut croire, surtout avec les dernière versions, sont gros problème est d'^tre un langage interprété qui le rend bien lourd pour certaines taches comme celle ci !
EDIT :Réussi quasi instantané pour les nombres de 1 à 10 !
Attention à ceux qui se cassent la tête, je publie mon algo! ;)
Je ne pouvais plus renoncer au défi, et faut dire que 4 secondes pour trouver la solution, c'est digne du prestige!
Je ne pouvais plus renoncer au défi, et faut dire que 4 secondes pour trouver la solution, c'est digne du prestige!
//On autorise au script de tourner pendant //30 secondes, sans quoi la limite établie //par défaut pourrait nous emmerder. set_time_limit(30); //On cherche maintenant à savoir le + petit //nombre qui, divisé de par 1 à 20, ne laisse //aucun reste. Pensons d'abord que pour être //divisible par 20, il faut être un multiple //de 20. La boucle fera ainsi des sauts de 20, //ce qui évitera enfin d'avoir à tester chaque //nombre d'ici à la solution. ouf! =p //On cherche aussi à ne pas trop encombrer la //boucle pour avoir une réponse le + vite que //possible. Ainsi, il se fait mieux de déclarer //l'array $diviseurs à l'extérieur, sans quoi //le range sera continuellement réécrit. //(des dizaines de millions de fois! o=) $saut = 20; $diviseurs = range(20, 2); $start = time(); //Je calcule le temps d'execution //juste question de savoir! ;) for($nombre = $saut; $reste !== 0; $nombre += $saut){ //Maintenant, pensons à réduire le temps //de calcul en délaissant immédiatement //les nombres qui ne répondent pas aux //conditions. Pour ce faire, nous inversons //le range pour que le plus grand diviseur //soit en première place. (parce que bien //moins de nombres se divisent par 20 que par 2!) //Dès qu'un nombre ne satisfait pas, soit //il est indivisible par un des diviseurs, //on passe au suivant sur le champs. //(d'où if($reste) break;!) //J'ai aussi retiré les diviseurs dont le //résultat est explicite. Souvenons-nous que //la division par zéro est indéfinie, et que //la division par 1 donne un tout, soit aucun reste. foreach($diviseurs as $diviseur){ $reste = $nombre % $diviseur; if($reste) break; }} $end = time(); echo ($nombre - $saut) . ' | ' . ($end - $start) . ' secondes';
Merci pour ton interpretation j'ai essayé avec foreach (range(1, 20) as $UnAVingt)
mais ca retourne 0 quand meme et j'aimerais bien juste savoir si ce que je tente de faire est faisable en php (le fait que j'essaie de diviser une variable par toutes les valeurs d'un tableau une par une) et je veux savoir aussi si je l'ai bien fait ou pas
J'ai fait quelque chose rapidement es ce que c'est ca que tu veux comme résultat :
$r = 1
1 / 0 =
1 / 1 = 1
1 / 2 = 0.5
1 / 3 = 0.33333333333333
1 / 4 = 0.25
1 / 5 = 0.2
1 / 6 = 0.16666666666667
1 / 7 = 0.14285714285714
1 / 8 = 0.125
1 / 9 = 0.11111111111111
1 / 10 = 0.1
1 / 11 = 0.090909090909091
1 / 12 = 0.083333333333333
1 / 13 = 0.076923076923077
1 / 14 = 0.071428571428571
1 / 15 = 0.066666666666667
1 / 16 = 0.0625
1 / 17 = 0.058823529411765
1 / 18 = 0.055555555555556
1 / 19 = 0.052631578947368
1 / 20 = 0.05
il prend r qui vaut 0 à la base puis qu'il le divise par tout les nombres de 1 à 20 si le quotient est un entier (donc le le reste est sensé être nul ,d'où le "$r % $UnAVingt != 0") pour tous les nombres de 1 à 20 alors le programme devrait afficher $r sinon $r prend la valeur r+1 et il recommence la boucle jusqu'à ce qu'il trouve le nombre le plus petit qui peut etre divisé par tous les nombres de 1 à 20
je sais que ce n'est pas très efficace comme code pour la machine qui le fait touner mais j'ai pas trouvé mieux...
Tu veux trouver le premier r qui diviser par un nombre compris entre [1-20] à un reste R = 0 et comme quotient Q un entier naturel N
faisons le calcul à la main
on pars avec r = 0
en divison euclidienne :
0/1 R-> 0 et Q-> 0 ton code s'arrête la il a trouver un r avec un reste nul et un quotient entier
mais comment faire pour l'obliger à verifier tous les Quotients un par un c'est ca que je n'arrive pas à faire