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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda C++ suma de digitos hasta un solo digito.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda C++ suma de digitos hasta un solo digito.  (Leído 7,507 veces)
Morx

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda C++ suma de digitos hasta un solo digito.
« en: 10 Noviembre 2018, 10:55 am »

Buenas!
Me preguntaba como podria hacer la suma de digitos de un numero hasta llegar a un numero de un solo digito.
EJEMPLO:
29.
La suma de sus dígitos 2 + 9 = 11.
La suma de los dígitos de 11 es 1 + 1 = 2.
Código:
#include <iostream>

using namespace std;

int suma_digitos (int n);

int main()
{
    int n,resultado;

    cout << "Digite un numero: ";
    cin >> n;

    resultado = suma_digitos(suma_digitos(n));
    cout << resultado;

    return 0;
}

int suma_digitos(int n){
    int s=0;
    while (n>0){
        s = s+ n%10;
        n = n/10;
        cout << s;
        return s;}}


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda C++ suma de digitos hasta un solo digito.
« Respuesta #1 en: 10 Noviembre 2018, 12:35 pm »

Con log10(x)+1 sabes de cuántos dígitos se compone x. Tendrás que repetir tu función hasta que ese valor sea 1.

Otra opción es que cuentes cuántas veces repites el bucle dentro de tu función.


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Ayuda C++ suma de digitos hasta un solo digito.
« Respuesta #2 en: 10 Noviembre 2018, 14:04 pm »

Veo que tu pregunta esta relacionada con el tema de primos absolutos, o por lo menos necesitas una funcion simiar que descomponga el numero en sus digitos y los sume.

Tal vez lo que necesitas es una funcion Recursiva, si no has visto ese tema, lo mas probable es que necesites hacerlo de forma Iterativa.

De hecho en tu ejemplo que pones, esta implicita la idea de recursion.

Código:
resultado = suma_digitos(suma_digitos(n));

En tu ejemplo quieres que el resultado sea el valor de "suma_digitos" que a su vez tambien vuelve a llamar a "suma_digitos"


Dejo un ejemplo funcionan con metodo RECURSIVO. Lo deje con comentarios para puedas seguir un poco el codigo.

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int suma_de_digitos_recursiva(int numero);
  6.  
  7. int main() {
  8. int N = 99999999;
  9. suma_de_digitos_recursiva(N);
  10. }
  11.  
  12.  
  13. int suma_de_digitos_recursiva(int numero) {
  14. char temporal[20] = {0};
  15. int suma = 0;
  16. int len,i;
  17. sprintf(temporal,"%i",numero); //Aqui "copiamos" el numero a una cadena de texto para poder iterar facilmente sobre cada digitio individual del numero
  18. printf("Prosesando el numero %s\n",temporal);
  19. len = strlen(temporal); //Sacamos la longitud del numero
  20. if(len == 1) { //Si la longitud del numero es solo de uno ya no hacemos nada retornamos el numero
  21. printf("Finalizamos, el numero tiene un solo digito\n");
  22. return numero;
  23. }
  24. else { //Si la longitud es mayor que uno sumamos los digitos individuales
  25. i = 0;
  26. while(i < len) {
  27. suma += temporal[i] - '0';
  28. i++;
  29. }
  30. printf("La suma es %i\n",suma);
  31. return suma_de_digitos_recursiva(suma);
  32. }
  33. }
  34.  

Saludos
« Última modificación: 10 Noviembre 2018, 14:34 pm por AlbertoBSD » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Ayuda C++ suma de digitos hasta un solo digito.
« Respuesta #3 en: 11 Noviembre 2018, 16:02 pm »

No es necesario usar funciones como log o convertir el numero a string, tampoco es necesaria la recursion.

Basta comparar el numero contra 10.
Si lo que llevas despues de calcular la suma de los digitos es menor que 10 (y mayor o igual que 0) entonces el numero es de longitud 1.

Algo asi:

Código
  1. int obtener_un_digito(int numero_inicial) { .  // numero_inicial >= 0
  2.  int un_digito = numero_inicial;
  3.  while(un_digito >= 10) {
  4.      un_digito = suma_digitos(un_digito);
  5.  }
  6.  return un_digito;
  7. }
  8.  

      
« Última modificación: 12 Noviembre 2018, 06:30 am por CalgaryCorpus » En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
kub0x
Enlightenment Seeker
Colaborador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: Ayuda C++ suma de digitos hasta un solo digito.
« Respuesta #4 en: 11 Noviembre 2018, 16:26 pm »

Bueno, ya llega el gracioso a decirte que matemáticamente basta con computar el módulo 9 dado que estás con raíces digitales.
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Ayuda C++ suma de digitos hasta un solo digito.
« Respuesta #5 en: 13 Noviembre 2018, 17:56 pm »



Dejo un ejemplo funcionan con metodo RECURSIVO. Lo deje con comentarios para puedas seguir un poco el codigo.

Código
  1. ...
  2. int suma_de_digitos_recursiva(int numero) {
  3. char temporal[20] = {0};
  4. int suma = 0;
  5. int len,i;
  6. sprintf(temporal,"%i",numero); //Aqui "copiamos" el numero a una cadena de texto para poder iterar facilmente sobre cada digitio individual del numero
  7. printf("Prosesando el numero %s\n",temporal);
  8. len = strlen(temporal); //Sacamos la longitud del numero
  9. if(len == 1) { //Si la longitud del numero es solo de uno ya no hacemos nada retornamos el numero
  10. printf("Finalizamos, el numero tiene un solo digito\n");
  11. return numero;
  12. }
  13. else { //Si la longitud es mayor que uno sumamos los digitos individuales
  14. i = 0;
  15. while(i < len) {
  16. suma += temporal[i] - '0';
  17. i++;
  18. }
  19. printf("La suma es %i\n",suma);
  20. return suma_de_digitos_recursiva(suma);
  21. }
  22. }
  23.  
...

2 COMENTARIOS:
  • Aunque la solución sea correcta, parece que la función recursiva tiene a su vez, un bucle, que podriamos computar también recursivamente
  • Yo pienso que los protocolos de entrada-salida hay que dejarlos al margen de las funciones de cómputo. Simplemente, ayuda a separar la I/0 del procesamiento


Propongo esta:

Código
  1. /*
  2.  
  3. NOTE: In this context, we can safely take log(0)=0 as an extension of ordinary log, for which 0 is undefined
  4.  
  5.  
  6.  P : N >= 0
  7.  fun sumDigits(int N) dev s
  8.  Q : s = \sum i : 0 <= i <= log(N) : (N/10^i)%10
  9.  
  10.  INMERSION
  11.  
  12.  FINAL APPROACH
  13.  
  14.  P' = P and 0<= n <= N and ac = \sum i : 0 <= i <= log(N/n) : (N/10^i)%10
  15.  fun sumDigits(int n,int ac) dev s
  16.  Q' = Q[N/n]
  17.  
  18.  Init call: n=N ac=0
  19.  
  20.  case n=0 : return ac
  21.  case n>0 : return sumDigits(n/10,ac+n%10)
  22.  
  23.  
  24. */
  25. #include <iostream>
  26. using namespace std;
  27. #define MAX 10000
  28.  
  29. int sumDigitsG(const int n, const int ac)
  30. {
  31.  if (n) return sumDigitsG(n/10,ac+n%10);
  32.  return ac;
  33. }
  34.  
  35. int sumDigits(const int N)
  36. {
  37.  return sumDigitsG(N,0);
  38. }
  39.  
  40. /* Formalization for solveG omitted */
  41.  
  42. void solveG(const int N,int V[], int &num)
  43. {
  44.  if (N>=10) {
  45.    V[num++]=sumDigits(N);
  46.    solveG(V[num-1],V,num);
  47.    return;
  48.  }
  49.  return;
  50. }
  51.  
  52.  
  53.  
  54. int main(int argc, char **args)
  55. {
  56.  int V[MAX];
  57.  int N;
  58.  for ( ; cin >> N ; )
  59.    {
  60.      int num=0;
  61.      solveG(N,V,num);
  62.      for (int n=0; n<num ;n++)  cout << V[n] << " " ;
  63.      cout << endl;
  64.    }
  65. }
  66.  
  67.  


Y algunos casos de prueba. Se da un número, y el programa da el vector con la suma de los digitos de ese, del que se obtiene... hasta llegar a una cigra
Código:
 g++ sumDigits2.cc -o main && ./main
13
4
1456
16 7
177777
36 9
« Última modificación: 13 Noviembre 2018, 18:09 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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