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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Algoritmo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Algoritmo  (Leído 5,223 veces)
georginho30

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Algoritmo
« en: 4 Noviembre 2020, 08:48 am »

buenas, se me pide que divida un número en dígitos y multiplique cada dígito por este algoritmo 2^posición x mod 11. como se haría para meter este algoritmo en mi programa?


En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.524


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Algoritmo
« Respuesta #1 en: 4 Noviembre 2020, 12:21 pm »

Qué tienes hecho hasta el momento? Muestra tus avances.

Saludos!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

georginho30

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Algoritmo
« Respuesta #2 en: 4 Noviembre 2020, 14:32 pm »

Este es el código. me confundi y en vez de multiplicar por el algoritmo, multiplique por la posición en la que se encontraba el dígito. si me podéis ayudar a introducir ese algoritmo lo agradeceria
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5.  
  6. int main(int argc, char const *argv[])
  7. {
  8. int Topper=0, Harriet=0, Spewart=0, Rango=0;
  9. int suma1=0, suma2=0, dígitos=0, dígitos2=0, dígitos3=0, dígitos4=0;
  10. int producto1=0, producto2=0, producto3=0, producto4=0;
  11. int resto1=0, resto2=0, resta1=0, resta2=0;
  12.  
  13. do {
  14. printf("Dime un número de 4 dígitos");
  15. scanf("%d", &Topper);
  16. if (Topper<1000 ||
  17. Topper>10000)
  18. {
  19. printf("Código no válido\n");
  20. exit(0);
  21. }
  22. }
  23. while (Topper<1000 || Topper>10000);
  24.  
  25. do {
  26. printf("Dime un número de 4 dígitos");
  27. scanf("%d",&Harriet);
  28. if (Harriet<1000 || Harriet>10000)
  29. {
  30. printf("Código no válido\n");
  31. exit(0);
  32. }
  33. }
  34. while (Harriet<1000 || Harriet>10000);
  35.  
  36. do {
  37. printf("Dime un número de 5 dígitos");
  38. scanf("%d",&Spewart);
  39. if (Spewart<10000 || Spewart>100000)
  40. {
  41. printf("Código no válido\n");
  42. exit(0);
  43. }
  44. }
  45. while (Spewart<10000 || Spewart>100000);
  46.  
  47. do {
  48. printf("Dime un número de 5 dígitos");
  49. scanf("%d",&Rango);
  50. if (Rango<10000 || Rango>100000)
  51. {
  52. printf("Código no válido\n");
  53. exit(0);
  54. }
  55. }
  56. while (Rango<10000 || Rango>100000);
  57.  
  58.  
  59. for (int i = 4; i > 0; --i){
  60.  
  61.  dígitos = Topper % 10;
  62.  Topper = Topper/10;
  63.  
  64.  producto1 = producto1 + (dígitos*(pow(2,i)%11);
  65. }
  66.  
  67. for (int j = 4; j > 0; --j){
  68.  
  69.  dígitos2 = Harriet % 10;
  70.  Harriet = Harriet/10;
  71.  
  72.  producto2 = producto2 + dígitos2*j;
  73.  
  74. }
  75.  
  76. suma1 = producto1 + producto2;
  77.  
  78.  
  79. for (int k = 5 ; k >0 ; --k)
  80. {
  81.  dígitos3 = Spewart % 10;
  82.  Spewart = Spewart/10;
  83.  
  84.  producto3 = producto3 + dígitos3*(k%10);
  85.  
  86. }
  87.  
  88. for (int t = 10 ; t > 5 ; --t){
  89.  dígitos4 = Rango % 10;
  90.  Rango = Rango/10;
  91.  
  92.  producto4 = producto4 + dígitos4*(t%10);
  93.  
  94. }
  95.  
  96. suma2 = producto3 + producto4;
  97.  
  98. resto1 = suma1%11;
  99. resta1 = 11 - resto1;
  100.  
  101. if (resto1 > 0 && resta1 < 10)
  102. {
  103. printf("Primer dígito = %d", resto1);
  104. }
  105.  
  106. else if ((resta1 = 10))
  107. {
  108. printf("Primer dígito = 1");
  109. }
  110.  
  111. else
  112. printf("Primer dígito = 0");
  113.  
  114. resto2 = suma2%11;
  115. resta2 = 11 - resto2;
  116.  
  117. if (resta1 > 0 && resta1 < 10)
  118. {
  119. printf("Segundo dígito = %d\n", resto1);
  120. }
  121.  
  122. else if ((resta2 = 10))
  123. {
  124. printf("Segundo dígito = 1\n");
  125. }
  126.  
  127. else
  128. printf("Segundo dígito = 0\n");
  129.  
  130.  
  131.  
  132. }
« Última modificación: 4 Noviembre 2020, 15:47 pm por K-YreX » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Algoritmo
« Respuesta #3 en: 4 Noviembre 2020, 16:02 pm »

Si lo que quieres hacer es para cada dígito d, calcular: d * ((2^posicion) % 11); ya lo estás haciendo en la línea 64...
No sé dónde está el problema... :huh:

Lo que sí veo son varias cosas:
  • Utiliza constantes para guardar los números que aparecen sueltos. Así tu programa será más fácil de modificar y de entender.
  • Los bucles do-while() no los aprovechas. Si metes un exit(), el programa terminará y no te dejará elegir otro número hasta que introduzcas uno válido.
Código
  1. const int MIN = 0; // lo que sea
  2. const int MAX = 1000; // lo que sea
  3. int main(){
  4.  int valido = 1; // variable entera usada como bool (0/1)
  5.  int numero;
  6.  do {
  7.    printf("Introduce un numero entre [%d, %d]: ", MIN, MAX);
  8.    scanf("%d", &numero);
  9.    valido = (numero >= MIN && numero <= MAX); // valdra 1 si es cierto y 0 en caso contrario
  10.    if(!valido){
  11.      printf("El numero no es valido\n");
  12.    }
  13.  } while(!valido);
  14.  //...
  15. }

  • Las comparaciones se hacen con el operador de comparación ==, no con el operador de asignación =. En los últimos condicionales estás asignando los valores y como son distintos a 0, siempre te dará true esa condición.
Código
  1. int numero = 10;
  2. if(numero == 10)  // Si el numero es igual a 10...
  3.  printf("El numero es 10\n"); // ...muestras ese mensaje
  4. if(numero = 5) // Asignas el valor 5 a numero y como es != 0, es true...
  5.  printf("El numero es 5\n"); // ...muestras ese mensaje tambien
  6. if(numero = 0) // Asignas el valor 0 a numero y como es == 0, es false...
  7.  printf("El numero es 0\n"); // ... no se muestra este mensaje

Al final numero valdrá 0 y la SALIDA será:
Código:
El numero es 10
El numero es 5
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
georginho30

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Algoritmo
« Respuesta #4 en: 4 Noviembre 2020, 19:32 pm »

si el algoritmo está en la línea 64 pero al compilarlo me dice que hay un error en esa línea
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Algoritmo
« Respuesta #5 en: 4 Noviembre 2020, 19:50 pm »

Eso es porque no puedes usar el operador de módulo (%) entre un número decimal y un entero.
Código
  1. producto1 += digito * ((int)pow(2,i) % 11);
Con esto haces un casting a int de la potencia de 2 truncando su parte decimal y después obtienes el resto de dividir ese número entre 11.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
georginho30

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Algoritmo
« Respuesta #6 en: 5 Noviembre 2020, 00:34 am »

y otra cosa en el ejercicio me pide que se introduzcan 4 valores entre un determinado valor y si u numero esta fuera de esos valores que se termine el ejercicio y se vuelva al menú principal, ya que es un ejercicio que esta dentro de un void con un menú para abrir tres ejercicios por separado. puse exit, pero ya veo que con eso no se vuelve al menú sino que se finaliza el programa, así que, que puedo utilizar para que vuelva al menú?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Algoritmo
« Respuesta #7 en: 5 Noviembre 2020, 00:44 am »

Como ya te comenté, depende mucho de cómo tengas estructurado tu código. Pero a grandes rasgos, aunque la función sea de tipo void puedes poner un return y hacer que termine.
Código
  1. void func(){
  2.  printf("Hola ");
  3.  return;
  4.  printf(" Mundo!");
  5. }

SALIDA:
Código:
Hola 


También puedes usar una variable de control que mientras sea válida, sigue y cuando no lo sea, termine.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines