begin process at 2012 05 27 18:04:34
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > RECHERCHE DES NOMBRES CHANCEUX SELON STANISLAW ULAM

RECHERCHE DES NOMBRES CHANCEUX SELON STANISLAW ULAM


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :nombres, chanceux, ulam, maths Niveau :Débutant Date de création :27/11/2006 Date de mise à jour :30/11/2006 17:34:48 Vu :3 927

Auteur : Gueftones

Ecrire un message privé
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

 Description

Programme permettant d'afficher les nombres chanceux selon Stanislaw Ulam (cf http://fr.wikipedia.org/wiki/Nombre_chanceux )

On utilise ici un vector de booléens contenant "true" si le nombre est chanceux, et "false" sinon.
On élimine donc les nombres au fur et à mesure en les mettant à "false", on affiche enfin uniquement les indices du tableau pour lesquels on a "true".

Je n'ai pas grand chose à y ajouter, ce que je pense pouvoir tenter d'expliquer est dans les commentaires !


Source

  • #include<iostream>
  • #include<iomanip>
  • using namespace std;
  • //
  • //Fonction qui renvoie l'indice du prochain élément
  • //du tableau qui vaut 'true', càd le prochain entier
  • //encore actuellement "chanceux" ou 0 s'il n'y a pas
  • //de prochain nombre inférieur à la limite.
  • ///////////////////////////////////////////////////
  • int prochainVrai( bool *tab, int n, int taille )
  • {
  • for ( int i=n+1; i<taille; i++)
  • if ( tab[i] )
  • return i;
  • return 0;
  • }
  • //
  • //Recherche et affichage des nombres
  • //chanceux inférieurs à "limite"
  • ////////////////////////////////////
  • void chanceux( int limite )
  • {
  • bool tab[limite+1];
  • int pas=1, tmp, cpt;
  • //traitement de la première étape, on élimine les nombres impairs
  • for (int i =0; i<=limite; i++)
  • tab[i]=( i%2 != 0 );
  • //chaque itération de cette boucle représente une étape,
  • //on itère donc jusqu'à ce qu'il n'y ait plus
  • //de nombres inférieurs à la limite
  • while ( (pas=prochainVrai(tab,pas,limite+1)) != 0 )
  • {
  • tmp=0;
  • cpt=0;
  • //suppression des nombres correspondant à l'étape en cours
  • while ( (tmp=prochainVrai(tab,tmp,limite+1)) != 0)
  • {
  • cpt++;
  • if (cpt == pas)
  • {
  • tab[tmp]=false;
  • cpt=0;
  • }
  • }
  • }
  • // affichage des nombres chanceux
  • for(int i=1; i<=limite; i++)
  • if ( tab[i] )
  • cout << setw(7) << i << endl;
  • }
  • int main()
  • {
  • int lim= -1;
  • while ( lim < 0 )
  • {
  • cout << "Entrez la limite de recherche des nombres chanceux : ";
  • cin >> lim;
  • }
  • chanceux(lim);
  • return 0;
  • }
#include<iostream>
#include<iomanip>
using namespace std;

//
//Fonction qui renvoie l'indice du prochain élément 
//du tableau qui vaut 'true', càd le prochain entier
//encore actuellement "chanceux" ou 0 s'il n'y a pas
//de prochain nombre inférieur à la limite.
///////////////////////////////////////////////////
int prochainVrai( bool *tab, int n, int taille )
{
	for ( int i=n+1; i<taille; i++)
		if ( tab[i] )
			return i;
	return 0;
}

//
//Recherche et affichage des nombres 
//chanceux inférieurs à "limite"
////////////////////////////////////
void chanceux( int limite )
{
	bool tab[limite+1];
	int pas=1, tmp, cpt;
	
	//traitement de la première étape, on élimine les nombres impairs
	for (int i =0; i<=limite; i++)
		tab[i]=( i%2 != 0 );
	
	//chaque itération de cette boucle représente une étape,
	//on itère donc jusqu'à ce qu'il n'y ait plus
	//de nombres inférieurs à la limite
	while ( (pas=prochainVrai(tab,pas,limite+1)) != 0 )
	{		
		tmp=0;
		cpt=0;
		
		//suppression des nombres correspondant à l'étape en cours
		while ( (tmp=prochainVrai(tab,tmp,limite+1)) != 0)
		{	
			cpt++;	
			
			if (cpt == pas)
			{	
				tab[tmp]=false;
				cpt=0;
			} 
		}
	}
	
	// affichage des nombres chanceux	
	for(int i=1; i<=limite; i++)
		if ( tab[i] )
			cout << setw(7) << i << endl;
}


int main()
{
	int lim= -1;
	
	while ( lim < 0 )
	{	
		cout << "Entrez la limite de recherche des nombres chanceux : ";	
		cin >> lim;
	}
	
	chanceux(lim);
	
	return 0;
}

 Conclusion

Si vous y voyez des améliorations possibles, je suis intéressé :-)


 Historique

27 novembre 2006 23:27:24 :
correction des pléonasmes du genre if (tab[i] == true) , et passage de "(i%2==0) ? tab[i]=false : tab[i]=true;" vers "tab[i] = (i%2 != 0);"
30 novembre 2006 17:34:49 :
* utilisation d'un tableau statique * appel de la fonction "prochainVrai" uniquement dans le test de poursuite du while * affichage avec "setw"

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
Source avec une capture MULTIPLICATIONS: PETIT EXERCICE DE MATHS par gmorris
Source avec Zip Source .NET (Dotnet) LISTES DES NOMBRES PARFAITS INFERIEURES À N par Trezeguet
Source avec Zip Source avec une capture RESOLUTION DE SYSTEME LINEAIRE PAR LA METHODE DU GRADIENT CO... par zangul
Source avec Zip FACTORISATION D'UN NOMBRE EN NOMBRE PREMIER par Tearsofdestiny

Commentaires et avis

Commentaire de yann_lo_san le 27/11/2006 21:47:23

Pas d'iterator, pas de push_back()...
Le vector ici n'est pas utile puisque pas dynamique.
(bool bTab[lim+1];) suffit.
Sinon le principe est bien.

Commentaire de vecchio56 le 27/11/2006 23:01:32 administrateur CS

Quelques remarques:

while (prochainVrai(tab,tmp) != 0)
{  
  tmp=prochainVrai(tab,tmp);
Tu appelles deux fois prochainVrai(tab,tmp), c'est inutile

(i%2==0) ? tab[i]=false : tab[i]=true;
Autant mettre tab[i] = i%2;

Dans le test: if ( tab[i] == true )
Tu peux enlever le ==true, ca simplifie l'écriture

Commentaire de vecchio56 le 27/11/2006 23:03:13 administrateur CS

Reste a savoir a quoi servent ces nombres chanceux

Commentaire de yann_lo_san le 27/11/2006 23:08:13

J'ai pas osé le demander...

Commentaire de Gueftones le 27/11/2006 23:37:15

Merci pour les corrections, j'ai modifié ce que j'ai pu. Pour le reste, je ne vois pas comment ne pas appeler 2 fois prochainVrai(tab,tmp).
Quant à l'utilisation d'un tableau statique, je n'ai pas le temps ce soir, je ferai ça demain.

Sinon, je ne pense pas non plus que les nombres chanceux aient une grande utilité, mais j'avais à faire un programme permettant de résoudre ce problème et ça m'a un peu posé problème... Et puisqu'aucune autre source à ce sujet n'a été publiée ici, je pense que ma version pourra peut-être servir à quelqu'un, voilà tout.

Commentaire de vecchio56 le 28/11/2006 00:34:46 administrateur CS

while (tmp = prochainVrai(tab,tmp))
{    
  //tmp contient déja la bonne valeur

Commentaire de BruNews le 28/11/2006 00:49:42 administrateur CS

tab[i] = i & 1;

Commentaire de Necronomicon le 30/11/2006 09:24:21

Dans le traitement de la première étape, tu peux mettre ton i=2, et dans l'affichage (qui serait plus "clair" avec du setw) tu commence à 1.

Sinon tu pourrais nous dire ce que ça te donne jusqu'à 200/300 histoire qu'on vérifie la pratique. ;) (Normalement tu as dû mettre tes résultats dans un .txt en utilisant une commande shell non ? :) )

Commentaire de Gueftones le 30/11/2006 17:54:28

Voilà, j'ai fait quelques modifs, indiquées ci-dessus.
Pour les indices, ok pour commencer l'affichage à partir de 1, mais je préfère initialiser le tableau à partir de 0, c'est plus clair et propore.
J'obtiens cette liste avec 300 pour limite :
1     3     7     9    13    15    21    25    31    33    37    43    49    51    63    67    69    73    75    79    87    93    99   105   111   115   127   129   133   135   141   151   159   163   169   171   189   193   195   201   205   211   219   223   231   235   237   241   259   261   267   273   283   285   289   297

Et pour Necronomicon, oui oui t'inquiètes pas, j'ai bien fait mon travail :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

je cherche quelqu'un fort en maths et qui est en 1ere ES !! [ par GEO ] je cherche quelqu'un qui aurais le livre orange declic maths de 1 ES merci d'avance Probleme sur un programme qui calcule un pgcd [ par El loco ] Voila j ai un probleme sur le programme suivant, il marche correctement avec une grande serie de nombres mais quand je tape 15 et 32 il me donne un pg class pour manipuler des grands nombres [ par Orkblutt ] Salut,j'aimerai implementer une classe qui me permettrai de manipuler (+,-, /,*,%) des grands nombres (Nb&gt;32bits) mais je ne sais pas du tout comm Cas des tres grds nombres en C [ par unclecrufek ] slt a tousJ'ai un projet de math a realiser en C:convertir des nombres d'une base a une autre.Ce n'est pas bien complique, sauf qu'il faut que j'envis traviller avec de grands nombres [ par alfred289 ] est-ce que quelqu'un aurait une façon simple de travailler avec de très grands nombres ( des miliers de chiffres par exemple) Les nombres aléatoires en C++ (Visual C++ 6.0) [ par Yabo ] Tout d'abord voilà le code :CODE #include &lt;iostream&gt;#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;time.h&gt;using namespace std convertir les nombres en lettres [ par djamine ] salut les amisje cherche un code pour convertir les nombres (1 2 3 .....) en lettres ( un, deux , trois....)l'utilisateur donne le nombre et le progra COMPTER LE NOMBRES D'IMPRESSIONS [ par bilal ] VGTABONJOUR G cherché et essayé et toujour pas trouvé ou je dois attaquer pour faire mon petit soft.enfait je voudrai juste compter le nombre d'impres Nombres dans fichier .txt [ par Franckyom50 ] Salut à tous !J'aimerais savoir comment je peux récupérer une série de nombres qui se trouvent dans un fichier texte, sous cette forme :365221655236-2 Une sphere englobant tous les points [ par MrPatachou ] BonjourJe dois realiser un programme qui analyse des formes du dos ; mais je reste bloque a une etape a cause de mes lacunes en maths, je m explique :


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales