Algorithme de kaprekar

Fermé
chaimaebel Messages postés 12 Date d'inscription samedi 18 novembre 2017 Statut Membre Dernière intervention 8 janvier 2018 - Modifié le 22 nov. 2017 à 21:04
chaimaebel Messages postés 12 Date d'inscription samedi 18 novembre 2017 Statut Membre Dernière intervention 8 janvier 2018 - 23 nov. 2017 à 05:55
Salut ! j'ai essayé de faire l'algorithme de kaprekar en utilisant le langage C ! Mais j'arrive pas :(

#include <stdio.h>

int Decomp(int N,int n ){
 int T[];
 int i;
 i=0;
 while(i<n){
  T[i]=N%10;
  N=N/10;
  i=i+1;
 } return T;
}
void trie(int T[], int n){
 int i=0;
 int x=0;
 int j=0;
 for(i=0;i<n;i++){
  for(j=1;j<n;j++){
   if(T[i]<T[j]){
    x=T[i];
    T[i]=T[j];
    T[j]=x;
    j--;
   }
  }
 }
 x=T[0];
 for(i=0;i<b;i++){
  T[i]=T[i+1];
  T[n-1]=x;
 }
 
int Calculcroi(int T[], int n){
 int i,n1;
 n1=0;
 for(i=0;i<n;i++){
  n1=n1+T[i]*10^(n-1-i);
 } return n1;
}
int Calculdecroi(int T[],int n){
 int i,n2;
 n2=0;
 for(i=0;i<n;i++){
  n2=n2+T[i]*10^i;
 } return n2;
}


}
void  kaprekar(int N,int n,int MAXT){
 int T[],k;
 int n1,n2,i;
 i=0;
 k=N;
 do {
  N=k;
  T=Decomp(N,n);
  T=trie(T, n);
  n1=Calculcroi(T,n);
  n2=Calculdecroi(T,n);
  k=n1-n2;
 printf("%d=%d-%d \n",k,n2,n1);
 i=i+1;
  
 }while(k=0|| k=N || i>MAXI);
}

main(){
 int N,n,MAXT;
 printf("saisir le nombre de chiffre n  :");
 scanf("%d",&n);
 N=10^n;
 while(N>=10^n || N<0){
  scanf("%d",&N);
 }
 scanf("%d",MAXT);
  Decomp(N,n);
  trie(T, n);
  Calculcroi(T,n);
  Calculdecroi(T,n);
 
 kaprekar(N,n,MAXT);
 
}

4 réponses

luckydu43 Messages postés 3833 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 4 novembre 2024 951
22 nov. 2017 à 21:20
Bonsoir !

Je ne sais pas si tu vas avoir des réponses.
Essaie déjà de faire un peu de code propre : nommage explicite des variables, commentaires... Là, perso, je ne connais pas ton algo de tête ! Et je n'ai franchement pas envie de faire des recherches sur cet algo sachant que je vais devoir déboguer un code incompréhensible...

Soit plus explicite dans ta question.
Dégrossis le bazar en isolant les méthodes/fonctions/procédures qui marchent de celles qui ne marchent pas

Et à l'avenir... applique ce que je t'ai dit au quotidien : nommage explicite et commentaires. LA recette pour relire ton code 6 mois après :-D Surtout si d'autres (comme là maintenant tout de suite) sont amenés à le lire

Étonnant qu'on ne vous apprenne pas ça en école...
1
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
22 nov. 2017 à 21:55
Bonjour,

Avant de voir l'algorithme, il faut connaitre le langage. Il y a de très nombreuses erreurs. Je donne quelques unes mais il te faudra chercher les autres.
Ligne 4: Un tableau doit avoir une taille définie, ensuite on pourra y mettre des données de l'indice
0
à l'indice
n-1
.
Ligne 11: une fonction ne peut jamais retourner un tableau. Moyen souvent utilisé : c'est l'appelant qui le crée, le passe en paramètre, la fonction le remplit.
Ligne 49: c'est quoi cette accolade?
Ligne 65: pour les tests d'égalité il faut utiliser
==
.
Ligne 72 et 73: pour élever à la puissance, il n'y a pas d'opérateur (le
^
est un ou exclusif), il faut utiliser la fonction
pow( n , p )
qui fonctionne pour les
double
, ou écrire sa fonction.
Ligne 76: les paramètres d'un
scanf()
doivent être passé par adresse (avec un
&
).

Lors de la compilation le compilateur signale des erreurs et des warnings, les deux doivent être lus, compris et corrigés.
1
chaimaebel Messages postés 12 Date d'inscription samedi 18 novembre 2017 Statut Membre Dernière intervention 8 janvier 2018
22 nov. 2017 à 22:03
OUIIIIIIIIIII vous avez raison j'ai pas fait attention ! Mercii !
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
23 nov. 2017 à 05:23
Il reste beaucoup plus que 3 problèmes, relis bien tout ce qui a été répondu. Personne d'autre que toi ne rendras ce code lisible.
1
chaimaebel Messages postés 12 Date d'inscription samedi 18 novembre 2017 Statut Membre Dernière intervention 8 janvier 2018
23 nov. 2017 à 05:55
D'accord ! Merci pour me repondre ! C'est gentille de votre part :)
0
chaimaebel Messages postés 12 Date d'inscription samedi 18 novembre 2017 Statut Membre Dernière intervention 8 janvier 2018
22 nov. 2017 à 21:58
Ouii vous avez raison ! j'ai remodifier le Voilaa ! mais il reste des 3 probleme


#include <stdio.h>

int Decomp(int N,int n ){
int T[10];
int i;
i=0;
while(i<n){
T[i]=N%10;
N=N/10;
i=i+1;
} return T;
}
void trie(int T[], int n){
int i=0;
int x=0;
int j=0;
for(i=0;i<n;i++){
for(j=1;j<n;j++){
if(T[i]<T[j]){
x=T[i];
T[i]=T[j];
T[j]=x;
j--;
}
}
}
x=T[0];
for(i=0;i<n;i++){
T[i]=T[i+1];
T[n-1]=x;
}

int Calculcroi(int T[], int n){
int i,n1;
n1=0;
for(i=0;i<n;i++){
n1=n1+T[i]*10^(n-1-i);
} return n1;
}
int Calculdecroi(int T[],int n){
int i,n2;
n2=0;
for(i=0;i<n;i++){
n2=n2+T[i]*10^i;
} return n2;
}


}
void kaprekar(int N,int n,int MAXT){
int T[10],k;
int n1,n2,i;
i=0;
k=N;
do {
N=k;
T[10]=Decomp(N,n);
trie(T,n);
n1=Calculcroi(T,n);
n2=Calculdecroi(T,n);
k=n1-n2;
printf("%d=%d-%d \n",k,n2,n1);
i=i+1;

}while(k=0||k=N|| i>MAXT);
}












main(){
int N,T[10],n,MAXT;
printf("saisir le nombre de chiffre n :");
scanf("%d",&n);
N=10^n;
while(N>=10^n || N<0){
scanf("%d",&N);
}
scanf("%d",&MAXT);
Decomp(N,n);
trie(T, n);
Calculcroi(T,n);
Calculdecroi(T,n);

kaprekar(N,n,MAXT);

} :(
0