Algorytm dodawania cyfr danej liczby

Algorytm dodawania cyfr danej liczby
Patryxster :V
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:8
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

Kopiuj
#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;}
   }

}

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Silesia/Marki
  • Postów:5505
3

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

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

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
Patryxster :V
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 3 lata
  • Postów:8
0

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

enedil
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Postów:1027
2

Istnieje też alternatywna implementacja:

Kopiuj
int digital_root(unsigned n) {
    if (n == 0)
        return 0;
    n %= 9;
    if (n == 0)
        return 9;
    return n;
}
_13th_Dragon
n %= 9; - późna godzina, człowiek zmęczony ... :) albo ja czegoś tu nie rozumiem ...
enedil
@_13th_Dragon: być może czegoś nie rozumiesz. Kod jest poprawny.
enedil
Sprawdziłem dla wszystkich unsigned intów, że moja wersja i wersja @KamilAdam zwracają to samo.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.