NUMERO KAPREKAR
Publicado por carlos (12 intervenciones) el 20/04/2012 20:50:10
Hola, tengo una duda sobre el siguiente programa del numero kaprekar: http://es.wikipedia.org/wiki/N%C3%BAmero_de_Kaprekar
Solo me faltan los procedures 'descomponer' y 'escribir cabecera', alguien que me ayude? (agradeceria que me respondiesen justo sobre este programa, la duda concreta que tengo, no que hagan otro distinto. Si hay otro fallo en el resto del programa avisadme. muchas gracias).
PROGRAM KapreKar;
USES crt;
PROCEDURE obtener_num_valido ({S} VAR n: integer);
BEGIN Repeat write ('dime un numero de 4 digitos no todos iguales: ');
readln
Until (n>0) and (n<9999) and (n mod 1111<>0)
END;
PROCEDURE escribir_cabecera;
PROCEDURE calcular_siguiente ({E/S} VAR n: integer);
VAR mayor, menor: integer;
d0, d1, d2, d3: integer;
PROCEDURE intercambiar ( VAR aux, di, dj: integer);
BEGIN aux:=di; di:=dj; dj:= aux;
END;
PROCEDURE ordenar ({E/S} d3, d2, d1, d0: integer);
BEGIN If d3<d2 Then intercambiar (d3,d2);
If d2<d1 Then intercambiar (d2,d1);
If d1<d0 Then intercambiar (d1,d2); {d0 es el menor}
If d3<d2 Then intercambiar (d3,d2);
If d2<d1 Then intercambiar (d2,d1); {en el siguiente menor}
If d3<d2 Then intercambiar (d3,d2);
END;
PROCEDURE descomponer ({E} VAR n: integer; {S} VAR d3,d2,d1,d0: integer);
BEGIN d3:= n div 1000;
d2:= (n div 100) mod 10;
d1:= (n div 10) mod 10;
d0:= n mod 10
END;
BEGIN descomponer (n,d3,d2,d1,d0);
ordenar(d3,d2,d1,d0); {devuelve d3>=d2>=d1>=d0}
componer (mayor,d3,d2,d1,d0);
componer (menor,d0,d1,d2,d3);
writeln(n:6, mayor, menor:8, mayor-menor:8); n:=mayor-menor
END;
VAR n: integer;
anterior: integer;
BEGIN
obtener_num_valido(n);
escribir_cabecera;
repeat anterior:=n;
calcular_siguiente(n)
until anterior=n;
END.
Solo me faltan los procedures 'descomponer' y 'escribir cabecera', alguien que me ayude? (agradeceria que me respondiesen justo sobre este programa, la duda concreta que tengo, no que hagan otro distinto. Si hay otro fallo en el resto del programa avisadme. muchas gracias).
PROGRAM KapreKar;
USES crt;
PROCEDURE obtener_num_valido ({S} VAR n: integer);
BEGIN Repeat write ('dime un numero de 4 digitos no todos iguales: ');
readln
Until (n>0) and (n<9999) and (n mod 1111<>0)
END;
PROCEDURE escribir_cabecera;
PROCEDURE calcular_siguiente ({E/S} VAR n: integer);
VAR mayor, menor: integer;
d0, d1, d2, d3: integer;
PROCEDURE intercambiar ( VAR aux, di, dj: integer);
BEGIN aux:=di; di:=dj; dj:= aux;
END;
PROCEDURE ordenar ({E/S} d3, d2, d1, d0: integer);
BEGIN If d3<d2 Then intercambiar (d3,d2);
If d2<d1 Then intercambiar (d2,d1);
If d1<d0 Then intercambiar (d1,d2); {d0 es el menor}
If d3<d2 Then intercambiar (d3,d2);
If d2<d1 Then intercambiar (d2,d1); {en el siguiente menor}
If d3<d2 Then intercambiar (d3,d2);
END;
PROCEDURE descomponer ({E} VAR n: integer; {S} VAR d3,d2,d1,d0: integer);
BEGIN d3:= n div 1000;
d2:= (n div 100) mod 10;
d1:= (n div 10) mod 10;
d0:= n mod 10
END;
BEGIN descomponer (n,d3,d2,d1,d0);
ordenar(d3,d2,d1,d0); {devuelve d3>=d2>=d1>=d0}
componer (mayor,d3,d2,d1,d0);
componer (menor,d0,d1,d2,d3);
writeln(n:6, mayor, menor:8, mayor-menor:8); n:=mayor-menor
END;
VAR n: integer;
anterior: integer;
BEGIN
obtener_num_valido(n);
escribir_cabecera;
repeat anterior:=n;
calcular_siguiente(n)
until anterior=n;
END.
Valora esta pregunta


0