Ayuda constante de Kapreker :c

Iniciado por maikel_12, 15 Septiembre 2016, 23:24 PM

0 Miembros y 1 Visitante están viendo este tema.

maikel_12

Hola primero que todo soy nuevo aquí mucho gusto, también soy nuevo en esto de la programación y la informática así que agradezco mucho de antemano todo la ayuda posible

me han mandado de actividad hacer la constante de Kapreker dandome este problema:

PROBLEMA: Desarrolla en Lenguaje C el siguiente problema: Constante de Kaprekar El matemático indio Dattaraya Ramchandra Kaprekar descubrió en 1949 una curiosa característica del número 6174. Hoy, se conoce a dicho número como constante de Kaprekar en honor a él. El número es notable por la siguiente propiedad: 1. Elige un número de cuatro dígitos que tenga al menos dos diferentes (es válido colocar el dígito 0 al principio, por lo que el número 0009 es válido). 2. Coloca sus dígitos en orden ascendente y en orden descendente para formar dos nuevos números. Puedes añadir los dígitos 0 que necesites al principio. 3. Resta el menor al mayor. 4. Vuelve al paso 2. A este proceso se le conoce como la rutina de Kaprekar, y siempre llegará al número 6174 en, como mucho, 7 iteraciones. Una vez en él, el proceso no avanzará, dado que 7641 − 1467 = 6174. Por ejemplo, el número 3524 alcanzará la constante de Kaprekar en 3 iteraciones:

5432 − 2345 = 3087

8730 − 0378 = 8352

8532 − 2358 = 6174

Los únicos dígitos de cuatro cifras para los que la rutina de Kaprekar no alcanza el número 6174 son los repdigits, es decir aquellos cuyas cuatro cifras son iguales (como 1111), pues en la primera iteración se alcanzará el valor 0 y no podrá salirse de él. Es por esto que en el paso 1 se pedía explícitamente que el número inicial tuviera al menos dos dígitos diferentes. El resto de los números de cuatro cifras terminarán siempre en el número 6174. A continuación se muestran dos ejemplos más: · El número 1121 necesita 5 iteraciones:

2111 − 1112 = 0999

9990 − 0999 = 8991

9981 − 1899 = 8082

8820 − 0288 = 8532

8532 − 2358 = 6174

· El número 1893 necesita 7:

9831 − 1389 = 8442

8442 − 2448 = 5994

9954 − 4599 = 5355

5553 − 3555 = 1998

9981 − 1899 = 8082

8820 − 0288 = 8532

8532 − 2358 = 6174

El problema es que encontré este codigo en internet:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

int numero, n1=0,n2=0,n3=0,n4=0,aux,i,i2,max1=0,max2,max3,max4,numas,numdes;
char s, n;
int main()   
{
    printf("Programa para la constante Kaprekar");
    printf("\n ingresa un numero de 4 digitos \n");
    scanf ("%d",&numero);
    if(numero>999 && numero <=9999)
{
             printf ("\n Resultados \n");
    do
    {
            i2=0; i=0;
           
            aux=0;n1=0;n2=0;n3=0;n4=0;
           while(numero>10)
           {
           i2=numero%10;
            switch(aux)
{
     case 0:{n1=i2;aux ++ ; break;}
     case 1:{n2=i2;aux ++ ; break;}
     case 2:{n3=i2;aux ++ ; break;}
     }
     numero/=10;
     }
     n4=numero;
     
     max1=n1; max2=n2; max3=n3; max4=n4;
     if (max1!=max2||max2!=max3||max3!=max4 )
     {
     int i3=0;
      do
      {
         if (max1<=max2)
            {
                aux=max1;
                max1=max2;
                max2=aux;
            }
            if(max1>=max2 && max2<=max3)
             {
                 aux=max2;
                 max2=max3;
                 max3=aux;
               }
            if (max1>=max2 && max2 >=max3 && max3<=max4)
             {
                 aux=max3;
                 max3=max4;
                 max4=aux;
                      }
             i3++;
                      }
   while(i3<=3);
   numas=max1*1000+max2*100+max3*10+max4;
   numdes=max4*1000+max3*100+max2*10+max1;
   printf("%d - %d= %d \n",numas,numdes,numas-numdes);
   i++;
   numero=numas-numdes;
   if(numero==6174)
   i=9;
  else(1000);
}
else
{
    printf ("Repdigit, intente denuevo ");
    i=9;
}
}while(i<=7);
}
else
{
    printf ("el valor tiene mas o menos de 4 digitos");
}
    printf("fin del programa, presiona s para limpiar pantalla");
    scanf("%s", &s);
    system("cls");
system("pause");
return 0;
}


quisiera saber si alguien me explica bien este codigo? ya que hay cosas que no logro entender :c también se dice que los números deben ir siempre de 4 digitos pero aveces introduzco un número la combinación de 4 digitos y entre los resultados hay varios de solo 3 o 2 digitos entonces esta mal :/, también cuando pongo el 1001 por ejemplo se va a un ciclo infinito salen un montón de números y nunca se detiene.

Agradecería muchisimo a quien pueda ayudarme con esto por favor, les agradezco mucho de antemano

ivancea96

Me parece algo "mejor" hecho este: https://sites.google.com/site/programmingwithsantiago/kaprekars-constant-using-c-language
Además, tiene comentarios y partes bastante bien definidas.

Lo único, 2 cosas:
-Tiene un error. La línea 15 hay que cambiarla por: int y=0, z;
-Es un bucle que hace el procedimiento con cada número del 1000 al 9999 (excepto los de 4 cifras iguales).
Es un código algo guarro, pero bueno.

En cualquier caso, lo mejor es que lo intentes hacer tú. No sé qué nivel tienes, pero si vas paso a paso, irás viendo qué problemas tienes, e incluso puedes ponerlos por aquí para resolverlos. El procedimiento tiene unos pasos bastante simples. Lo más difícil: ordenar las cifras. Si nunca hiciste algo sobre ordenar, es también un buen comienzo.

maikel_12

Cita de: ivancea96 en 15 Septiembre 2016, 23:59 PM
Me parece algo "mejor" hecho este: https://sites.google.com/site/programmingwithsantiago/kaprekars-constant-using-c-language
Además, tiene comentarios y partes bastante bien definidas.

Lo único, 2 cosas:
-Tiene un error. La línea 15 hay que cambiarla por: int y=0, z;
-Es un bucle que hace el procedimiento con cada número del 1000 al 9999 (excepto los de 4 cifras iguales).
Es un código algo guarro, pero bueno.

En cualquier caso, lo mejor es que lo intentes hacer tú. No sé qué nivel tienes, pero si vas paso a paso, irás viendo qué problemas tienes, e incluso puedes ponerlos por aquí para resolverlos. El procedimiento tiene unos pasos bastante simples. Lo más difícil: ordenar las cifras. Si nunca hiciste algo sobre ordenar, es también un buen comienzo.

si, mi idea es hacerlo por mi cuenta, pero cometí el error de desesperarme y enviar accidentalmente este codigo como mi tarea (obviamente le modifique las variables), y el proximo lunes debo defender el codigo y me gustaría hablar sobre el y decir el error que tenía :c, no encontré otra forma de hacerlo y simplemente me desesperé, pero estoy full al estudio para poder hacer estas cosas por mi cuenta

MAFUS

El fuente que has presentado tiene errores muy raros. Por ejemplo else(1000);

Haciendo uso de la librería estándar puedes pasar desde un número a una cadena de texto, así es fácil ordenar los números como quieras sin necesidad de descomponerlo y hacer extrañas comparaciones. Después conviertes la cadena en número otra vez y operas.

Como veo que es tarea no te pondré el código y te dejo con la idea :D

maikel_12

e intentado cambiar la linea 15 a int y=0, z; pero ahora los números que me daban infinitos ahora no me dan el número que debería en el resultado (el 6174)