2010-04-21 14 views
11

Poszukuję algorytmu do sumowania cyfr. Pozwól mi przedstawić na podstawową zasadę:Algorytm sumowania cyfr?

Say masz numer: 18268.

1 + 8 + 2 + 6 + 8 = 25 

2 + 5 = 7 

A 7 to nasza ostateczna liczba. Zasadniczo jest to dodawanie każdego numeru liczby całkowitej, aż dojdziemy do pojedynczej cyfry (zwanej też "rdzeniem"). Jest często używany przez numerologów.

Szukam algorytmu (nie musi być język w specyficznych) dla tego. Przeszukałem Google przez ostatnią godzinę pod takimi hasłami, jak digit sum algorithm i co tam, ale nie otrzymałem odpowiednich wyników.

Każda pomoc będzie wielki, dzięki.

+0

zadanie domowe? o czym myślałeś do tej pory? – Anycorn

+0

Zobacz także: http://stackoverflow.com/questions/478968/sum-of-digits-in-c –

+0

Nie, nie praca domowa. Chociaż widzę, jak byś się pomylił. Najtrudniejszą rzeczą, jaką robimy na studiach z programowaniem, jest obsługa plików. : P – Joe

Odpowiedz

29

Ponieważ 10-1 = 9, trochę teorii liczb powie Państwo, że ostateczna odpowiedź jest tylko n mod 9. Oto kod:

ans = n%9; 
if(ans==0 && n>0) ans=9; 
return ans; 

Przykład: 18.268% 9 7. (zobacz także:. Casting out nines)

+0

trzeba go zapętlić – Timmy

+3

Nie, możesz to załatwić. – Larry

+2

@Tymmy: Nie, nie musisz pętli. Weź długopis i papier i opracuj go dla siebie. (Działa, ponieważ suma cyfr jest niezmiennym modułem 9.) – ShreevatsaR

3

chciałbym spróbować to:

int number = 18268; 
int core = number; 
int total = 0; 

while(core > 10) 
{ 
    total = 0; 
    number = core; 
    while(number > 0) 
    { 
     total += number % 10; 
     number /= 10; 
    } 

    core = total; 
} 
+0

będziemy chcieli to zrobić w kółko aż ABS (łącznie) wynosi mniej niż 10, a następnie będziesz mieć twój główny numer. – Chad

+0

to nie wydaje się właściwe. robisz tylko jedno podsumowanie. potrzebujesz innej pętli lub rekurencji – Anycorn

1
  1. Mod cały numer o 10.
  2. dodać numer do tablicy.
  3. Dodaj całą tablicę.
+1

+1 za zapewnienie dobrego punktu startowego, ale nie robienie pracy domowej OP. –

+0

To nie jest praca domowa, Bob.:) I dziękuję za punkt wyjścia, mogę pracować w głowie, gdzie to idzie;) – Joe

2

Nie działa z liczbami ujemnymi, ale nie wiem, jak sobie z tym poradzić. Można również zmienić f(x) być iteracyjny:

sum(x) = 
    while ((x = f(x)) >= 10); 
    return x; 

f(x) = 
    if (x >= 10) return f(x/10) + x % 10 
    return x 

Można również skorzystać z teorii liczb, co daje ten f(x):

f(x) = 
    if (x == 0) return 0 
    return x % 9 
0
int number = 18268; 
int total = 0; 

while(number > 0) 
{ 
    total += number % 10; 
    total = total%10; 
    number /= 10; 
} 
0

to od bardzo dawno temu, ale najlepszym rozwiązaniem mam na to:

int digitSum(int num){ 
    if (num < 10) return num; 
    else return (n-1)%9+1; 
} 

nie wiem ile to jest lepiej, ale będzie to stanowić dla podzielna przez 9 liczb łatwo. Po prostu fajny algorytm.