elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ejercicios
| | | |-+  Problema de digitos de un número.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema de digitos de un número.  (Leído 8,369 veces)
j retirado

Desconectado Desconectado

Mensajes: 61



Ver Perfil WWW
Problema de digitos de un número.
« en: 28 Julio 2009, 00:14 am »

Enunciado: Un número se dice automórfico si su cuadrado termina en los mismos dígitos que el número original, por ejemplo 76^=5776. Un número se dice trimórfico si su cubo termina en los mismo dígitos que el número original, por ejemplo 5^3=125. Determinar los números automórficos y trimórficos menores que un número natural K dado, indicando además su cualidad de automórfico y/o trimórfico según corresponda.

De todas formas esta bueno generalizar la solución para calcular si un número es k-mórfico (o como se quiera llamar). Es decir, hacer un algoritmo que calcule para cualquier potencia, no solo para 2 y 3. Yo llegue a estas dos soluciones:

Primera (no óptima...):

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. #define FALSE 0
  6. #define TRUE !FALSE
  7. typedef int Bool;
  8.  
  9. int cant_digitos(int numero)
  10. {
  11. int cifras;
  12. for(cifras=0; pow(10, cifras)<=numero; cifras++)
  13. ;
  14. return cifras;
  15. }
  16.  
  17. void array_digitos(int numero, int numero2)
  18. {
  19. int cifras = cant_digitos(numero);
  20. int *array = (int *) calloc (cifras, sizeof(int));
  21. int *array2 = (int *) calloc (cifras, sizeof(int));
  22.  
  23. int i = 0;
  24. while(cifras>0)
  25. {
  26. array[i]  = numero%10;
  27. array2[i] = numero2%10;
  28. numero    = numero/10;
  29. numero2   = numero2/10;
  30. i++;
  31. cifras--;
  32. }
  33.  
  34. int j;
  35. for(j=0; j<i; j++)
  36. printf("array[%d] = %d  y array2[%d] = %d\n", j, array[j], j, array2[j]);
  37. printf("\n\n");
  38.  
  39. Bool b=TRUE;
  40. j=0;
  41. for(; j<i; j++)
  42. {
  43. if(array[j] != array2[j]) {
  44. b = FALSE;
  45. break;
  46. }
  47. }
  48.  
  49. free(array); array=NULL;
  50. free(array2); array2=NULL;
  51.  
  52. if(b) printf("Si se cumple la propiedad\n");
  53. else printf("No se cumple la propiedad\n");
  54. }
  55.  
  56. void array_digitos2(int numero, int numero2, int n)
  57. {
  58. int copia = numero;
  59. int cifras  = cant_digitos(numero);
  60. int *array  = (int *) calloc (cifras, sizeof(int));
  61. int *array2 = (int *) calloc (cifras, sizeof(int));
  62. int j, i;
  63.  
  64. i=0;
  65. while(cifras>0)
  66. {
  67. array[i]  = numero%10;
  68. array2[i] = numero2%10;
  69. numero    = numero/10;
  70. numero2   = numero2/10;
  71. i++;
  72. cifras--;
  73. }
  74.  
  75. Bool b=TRUE;
  76. for(j=0; j<i; j++)
  77. {
  78. if(array[j] != array2[j]) {
  79. b = FALSE;
  80. break;
  81. }
  82. }
  83.  
  84. free(array); array=NULL;
  85. free(array2); array2=NULL;
  86.  
  87. if(b)
  88. printf("%d es %d-morfico. Pues %d^%d=%f\n", copia, n, copia, n, pow(copia,n));
  89. }
  90.  
  91. int main()
  92. {
  93. int i, j, k, exp;
  94. printf("Chequear hasta K: "); scanf("%d", &k);
  95. printf("Chequear hasta Exponente: "); scanf("%d", &exp);
  96.  
  97. for(i=2; i<=k; i++)
  98. for(j=2; j<=exp; j++)
  99. array_digitos2(i, pow(i, j), j);
  100.  
  101. system("pause");
  102. return 0;
  103. }
  104.  



Segunda (mejor pues usa variables simples):

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define FALSE 0
  5. #define TRUE !FALSE
  6. typedef int Bool;
  7.  
  8. long int potencia(int a, int b)
  9. {
  10. if (b<=0)
  11. return 1;
  12. else
  13. return a*potencia(a,b-1);
  14. }
  15.  
  16. void funcion(int num, int exp)
  17. {
  18. Bool b = TRUE;
  19. int num2, cifras, copia=num;
  20. num2 = potencia(num, exp);
  21.  
  22. for(cifras=0; potencia(10,cifras)<=num; cifras++) ;
  23.  
  24. /* printf("num: %d, cifras: %d, num2: %d \n", num, cifras, num2); */
  25.  
  26. while(cifras>0)
  27. {
  28. /* printf("%d>0, %d(mod 10)=%d  == %d(mod 10)=%d \n", cifras, num, num%10, num2, num2%10); */
  29. if(num%10 != num2%10)
  30. {
  31. /* printf("Luego %d>0, %d(mod 10)=%d  == %d(mod 10)=%d \n", cifras, num, num%10, num2, num2%10); */
  32. b = FALSE;
  33. break;
  34. }
  35. num = num/10;
  36. num2 = num2/10;
  37. cifras--;
  38. }
  39.  
  40. if(b) printf("%d es automórfico. Pues %d^%d=%ld\n", copia, copia, exp, potencia(copia,exp) );
  41. /* else printf("\nNo es automórfico. Pues %d^%d=%ld\n", copia, exp, potencia(copia, exp)); */
  42. }
  43.  
  44. int main()
  45. {
  46. int k, i, exp, j;
  47. printf("ingrese K: "); scanf("%d", &k);
  48. printf("ingrese hasta que exponente: "); scanf("%d", &exp);
  49. for(i=2; i<=k; i++)
  50. for(j=2; j<=exp; j++)
  51. funcion(i, j);
  52.  
  53. system("pause");
  54. return 0;
  55. }
  56.  

Bienvenida es cualquier critica constructiva pues para aprender estamos aqui, y otras soluciones alternativas. Saludos.


En línea

h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: Problema de digitos de un número.
« Respuesta #1 en: 28 Julio 2009, 00:22 am »

Me atrevo a decir que la segunda es correcta  :rolleyes:


En línea

Caballero Maldito

Desconectado Desconectado

Mensajes: 63


Caballero-maldito U.U


Ver Perfil
Re: Problema de digitos de un número.
« Respuesta #2 en: 21 Agosto 2009, 02:33 am »

muy buen codigo, tenia pensado hacer el ciclo for que tienes en main para atras o en reverza como le digan jajaja comenzando de K hasta 2, veo k el tuyo va en orden que bien, si me queda tiempo propondre alguna solucion personal, saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Formatear Numero para limitar a dos digitos despues del punto ? (solved)
PHP
Diabliyo 3 7,321 Último mensaje 12 Enero 2011, 20:16 pm
por Diabliyo
Tengo una duda de como determinar los digitos de un número « 1 2 »
Programación C/C++
Felipe_Henriquez 13 35,416 Último mensaje 19 Agosto 2011, 04:22 am
por rir3760
Validar que solo se escriban numero de dos dígitos en un jtextfield
Java
Aikanáro Anário 5 8,162 Último mensaje 11 Julio 2012, 07:56 am
por azknight
Descubren el mayor número primo: 17 millones de dígitos
Noticias
wolfbcn 2 2,710 Último mensaje 7 Febrero 2013, 22:31 pm
por anonimo12121
Digitos de un numero en C
Programación C/C++
Dacan 6 17,782 Último mensaje 30 Marzo 2013, 12:34 pm
por 85
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines