Algorithme de kaprekar

chaimaebel Messages postés 16 Statut Membre -  
chaimaebel Messages postés 16 Statut Membre -
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

  1. luckydu43 Messages postés 4497 Date d'inscription   Statut Membre Dernière intervention   1 177
     
    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
  2. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    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
    1. chaimaebel Messages postés 16 Statut Membre
       
      OUIIIIIIIIIII vous avez raison j'ai pas fait attention ! Mercii !
      0
  3. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    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
    1. chaimaebel Messages postés 16 Statut Membre
       
      D'accord ! Merci pour me repondre ! C'est gentille de votre part :)
      0
  4. chaimaebel Messages postés 16 Statut Membre
     
    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