1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
// #include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int kaprekar(int n1, char det);
int longueur(int x, int nbch, char det); //donne le nombre de chiffre.
int decompose(int M, int a, int *tab, char det); //décompose en 2.
int main(int kap)
{
char rep='R', det;
int nb;
printf("Nombre de Kaprekar :\n");
printf("\nUn nombre de Kaprekar est un nombre qui, lorsqu'il est eleve au carre,\npeut etre separe en une partie gauche(M2) et une partie droite(M1) (non nulles)\ntelles que le nombre de chiffre de M1 doit etre egal a celui de M2 ou +1,\nensuite leur somme donne le nombre initial.\n");
while(rep!='Q')
{
printf("\nEntrez un nombre entier :");
scanf("%d",&nb);
printf("\nTapez D pour afficher le resultat avec les details\nou appuyez sur une touche pour continuer... :");
fgetc(stdin)!=EOF; //efface la mémoire tampon
scanf("%c",&det);
kap=kaprekar(nb, det);
if(kap==nb)
printf("\nVotre nombre est un nombre de Kaprekar.\n");
else
printf("\nVotre nombre n'est pas un nombre de Kaprekar.\n");
printf("\nTapez Q pour quitter ou appuyer sur une touche pour recommencer... :");
if(det=='D') //permet d'eviter d'avoir a appuyer 2fois sur "entrer" lorsque vous n'avez pas voulu afficher les details du calcul.
{
fgetc(stdin)!=EOF;
scanf("%c",&rep);
}
else
scanf("%c",&rep);
system("cls"); //efface l'écran.
}
return 0;
}
int kaprekar(int n1, char det)
{
int kapcar=0, n=0, kap=0, tab[2], nbch=0;
kapcar=n1*n1; //élève nb au carré.
if(det=='D')
printf("\nVotre nombre au carre vaut %d.\n", kapcar);
nbch=longueur(kapcar, nbch, det); //donne le nombre de chiffre de nb.
//donne la position n pour la découpe de nb^2.
if(nbch%2==0) //si le nombre de chiffre de nb est impair.
n=nbch/2;
else //si le nombre de chiffre de nb est pair.
n=(nbch/2)+1;
*tab=decompose(kapcar, n, tab, det); //décompose nb^2 en deux entiers, à la position n. Pour *tab voir fonction decompose.
kap=tab[0]+tab[1];
if(det=='D')
printf("\nOn additionne les deux parties :\n%d + %d = %d.\n",tab[0], tab[1], kap);
return kap;
}
int longueur(int x, int nbch, char det) //effectue une division par 10 et ajoute 1 à une variable tant que la division ne retourne pas 0.
{
while(x!=0)
{
x = x/10;
nbch=nbch+1;
}
if(det=='D')
printf("\nCelui-ci est compose de %d chiffre.\n", nbch);
return nbch;
}
int decompose(int M, int place, int *tab, char det)
{
int a=0;
a=pow(10,place); //élève 10 à la puissance n pour la découpe au bon endroit de M.
tab[0]=M/a; //range le nombre de gauche de M dans tab[0].
tab[1]=M%a; //range le nombre de droite de M dans tab[1].
if(det=='D')
printf("\nUne fois decompose convenablement:\nsa partie de gauche vaut %d\nsa partie de droite vaut %d.\n", tab[0], tab[1]);
return *tab; //je sais que ceci n'est pas nécessaire et que ça fonctionne sans mais je comprends pas bien pourquoi alors je le laisse, ça me parait plus logique.
} |
Partager