Les nombres de kaprekar

Soyez le premier à donner votre avis sur cette source.

Vue 10 022 fois - Téléchargée 404 fois

Description

L'algorithme de Kaprekar consiste à choisir un nombre n puis:
tant que n' != n
n = n'
soit n1 le nombre forme par les chiffres de n classés en ordre décroissant
soit n2 le nombre forme par les chiffres de n classés en ordre croissant
n' = n1 - n2
fin tant que

On montre que une suite ainsi construit ne converge que vers certains nombres particuliers, qui sont dit de Kaprekar.
Par extension, un nombre de Kaprekar est un nombre dont le carré peut se scinder en la somme du nombre.
Plus d'info sur http://mathworld.wolfram.com/KaprekarRoutine.html (page ultra complète)

Le petit programme que je propose permet de tester si un nombre est de Kaprekar ou non, ainsi que de vérifier que la suite de Kaprekar converge bien pour les nombres à 4 chiffres. La plupart du temps, la valeur finale est 6174, appelée constante de Kaprekar

Source / Exemple :


// Dans le zip.

Conclusion :


Je crois pas qu'il y ait des application aux nombres de kaprekar, mais j'aime les trucs inutiles :).
A faire : permettre de vérifier la convergence de la suite de Kaprekar pour les nombres avec un plus de 4 chiffres

PS: j'utilise la fonction itoa qui n'est pas standard, mais on peut aussi se débrouiller sans (c'est plus long).

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
14
Date d'inscription
vendredi 22 août 2003
Statut
Membre
Dernière intervention
9 décembre 2008

C'est du c++ que tu me fait là non ? Je touche pas trop au c++ :). Auparavant je l'avait fait avec des opérations sur les nombres (genre des modulos et des divisions par 10 pour obtenir le i-ème chiffre).

Par contre oui tu as raison pour le commentaire, c'est bien n1 - n2 (c'est ce que j'ai mis dans la source mais j'ai pas un labsus dans la présentation).

merci !
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
C'est n' = n1 - n2 et non n' = n1 + n2 , sinon ça converge pas.

Moi aussi j'aime bien ce genre de futilité - sans doute un problème créé pendant la guerre froide pour déconcentrer les scientifiques occidentaux ;>

Quant à tes scrupules à utiliser la fonction itoa() et ton envie d'aller au-delà de 4 chiffres, je te propose d'alléger ton source avec le code standard suivant :

std::string i2s( long n )
{
std::ostringstream oss ;
oss << n ;
return oss.str() ;
}
long s2i( const std::string& s )
{
long n ( 0 ) ;
std::istringstream iss ( s ) ;
iss >> n ;
return n ;
}
long algo_kaprekar( long n )
{
std::string n1 ( i2s( n ) ) ;
std::sort( n1.begin() , n1.end() , std::greater<char>() ) ;

std::string n2 ( i2s( n ) ) ;
std::sort( n2.begin() , n2.end() , std::less<char>() ) ;

return s2i( n1 ) - s2i( n2 ) ;
}

C'est un sujet trés intéressant.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.