Algorithme de kaprekar
chaimaebel
Messages postés
16
Statut
Membre
-
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
-
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...
-
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'indice0
à l'indicen-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 fonctionpow( n , p )
qui fonctionne pour lesdouble
, ou écrire sa fonction.
Ligne 76: les paramètres d'unscanf()
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. -
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.
-
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);
} :(