Un probleme en PHP

Résolu/Fermé
imrane555 Messages postés 255 Date d'inscription jeudi 29 mai 2014 Statut Membre Dernière intervention 26 octobre 2015 - Modifié par imrane555 le 25/10/2015 à 17:13
imrane555 Messages postés 255 Date d'inscription jeudi 29 mai 2014 Statut Membre Dernière intervention 26 octobre 2015 - 26 oct. 2015 à 09:58
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 :

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

3 réponses

jean448 Messages postés 1331 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 26 janvier 2017 237
Modifié par jean448 le 25/10/2015 à 17:27
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

--
0
imrane555 Messages postés 255 Date d'inscription jeudi 29 mai 2014 Statut Membre Dernière intervention 26 octobre 2015 88
25 oct. 2015 à 17:38
Salut
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
0
jean448 Messages postés 1331 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 26 janvier 2017 237
25 oct. 2015 à 19:04
tu veux juste diviser une variable par toutes les valeurs du tableau ?

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
0
imrane555 Messages postés 255 Date d'inscription jeudi 29 mai 2014 Statut Membre Dernière intervention 26 octobre 2015 88
25 oct. 2015 à 20:38
Wow ,merci beaucoup pour ce gros effort mais voilà en fait je que mon algorithme fasse ca
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...
0
jean448 Messages postés 1331 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 26 janvier 2017 237
25 oct. 2015 à 21:03
d'accord je viens de comprendre (fin je crois)

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
0
imrane555 Messages postés 255 Date d'inscription jeudi 29 mai 2014 Statut Membre Dernière intervention 26 octobre 2015 88
Modifié par imrane555 le 25/10/2015 à 22:53
Ah ouais je vois merci
mais comment faire pour l'obliger à verifier tous les Quotients un par un c'est ca que je n'arrive pas à faire
0
Utilisateur anonyme
25 oct. 2015 à 21:34
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! ;)
0
jean448 Messages postés 1331 Date d'inscription mardi 29 décembre 2009 Statut Membre Dernière intervention 26 janvier 2017 237
Modifié par jean448 le 25/10/2015 à 23:22
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 !
0
Utilisateur anonyme
26 oct. 2015 à 04:42
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!

//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';
0
imrane555 Messages postés 255 Date d'inscription jeudi 29 mai 2014 Statut Membre Dernière intervention 26 octobre 2015 88
26 oct. 2015 à 09:58
Mdrr tu m'a tué ( t'es genre le mec qui voit un cave faire et qui peut pas s'empêcher d'aller lui donner la solution)
projecteuler.net c'est là ou j'ai trouvé ça je crois que ca devrait t'interesser .
0