Algorytm dodawania cyfr danej liczby

0

Mam problem z poniższym kodem, nie wiem, czemu wypisuje on niewłaściwe wyniki, może jest jakiś błąd w rekurencji, tylko jaki ?

Biorąc liczbę naturalną n, weź sumę cyfr n. Jeśli ta wartość ma więcej niż jedną cyfrę, kontynuuj zmniejszanie w ten sposób, aż zostanie wygenerowana liczba jednocyfrowa.

Przykład: 456 >> 4+5+6 >>15>>1+5>>6

#include<iostream>
#include<string>
#include<cmath>

using namespace std;
  
int digital_root(int n)
{ 
 int x=0,y=0;
   while(n>0)
     {
    
     x=n%10;
     n=n/10;
     y=y+x;
    
    if((n<1)&&(y>9))
      { 
        digital_root(y);
    }
      if(y<10)
      {return y;}
   }

}

3

If powinien być poza pętlą. Poza tym kod można skrócić:

int digital_root(int n) {
  int sum = 0;
  while (n > 0) {
    sum += n % 10;
    n = n / 10;
  }
  return (sum < 10) ? sum : digital_root(sum);
}
0

@KamilAdam: Dziękuję, zauważyłem, że był też błąd w tym, że funkcja nic nie zwracała dla pierwszych wywołań

2

Istnieje też alternatywna implementacja:

int digital_root(unsigned n) {
    if (n == 0)
        return 0;
    n %= 9;
    if (n == 0)
        return 9;
    return n;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1