Wpisany przez Tomasz Lubiński,
11 stycznia 2011 13:45
Załóżmy, że mamy daną liczbę x i chcemy obliczyć sumę jej cyfr. Czyli, na przykład, jeżeli mamy daną liczbę x = 148, to w wyniku otrzymamy 1+4+8 = 13.
By rozwiązać to zadanie potrzebne będą nam dwie operacje:
By obliczyć sumę cyfr liczby x musimy wykonać następujące kroki:
Operację obliczania sumy cyfr liczby całkowitej x możemy zapisać następującym schematem blokowym:
Niech x będzie równe 148.
Na początku wynik ustawiamy na 0.
Dochodzimy do decyzji, czy x jest równe 0?
Nie, zatem:
wynik = wynik + (x mod 10) = 0 + (148 mod 10) = 0 + 8 = 8
x = x div 10 = 148 div 10 = 14
Sprawdzamy po raz kolejny, czy x jest równe 0?
Nie, zatem:
wynik = wynik + (x mod 10) = 8 + (14 mod 10) = 8 + 4 = 12
x = x div 10 = 14 div 10 = 1
Sprawdzamy po raz kolejny, czy x jest równe 0?
Nie, zatem:
wynik = wynik + (x mod 10) = 12 + (1 mod 10) = 12 + 1 = 13
x = x div 10 = 1 div 10 = 0
Sprawdzamy po raz kolejny, czy x jest równe 0?
Tak, zatem obliczyliśmy sumę cyfr liczby x=148, i wynik ten wynosi 13.
Dla zaawansowanych:
Przedstawiony algorytm oblicza sumę liczb dla systemu dziesiętnego. Można go jednak łatwo zaadoptować do obliczania sumy cyfr dla systemu liczbowego o dowolnej podstawie (np. dwójkowego lub szesnastkowego). W tym celu wystarczy przerobić fragment:
wynik = wynik + (x mod 10)
x = (x div 10)
na:
wynik = wynik + (x mod podstawa)
x = (x div podstawa),
gdzie podstawa jest wartością podstawy systemu liczbowego, dla którego chcemy obliczyć sumę cyfr (2 dla systemu dwójkowego, 10 dla dziesiętnego, 16 dla szesnastkowego, itp...). Jeżeli chcesz zobaczyć jak liczby dziesiętne wyglądają w innych systemach przeczytaj artykuł zamiana z i na system dziesiętny
By rozwiązać to zadanie potrzebne będą nam dwie operacje:
- dzielenie modulo (czyli reszta z dzielenia) - dzieląc x modulo 10 wyłuskamy z liczby x wartość jej ostatniej cyfry,
- dzielenie bez reszty (zwane czasem dzieleniem całkowitoliczbowym - div) - dzieląc x bez reszty przez 10, pozbędziemy się z niej ostatniej cyfry.
By obliczyć sumę cyfr liczby x musimy wykonać następujące kroki:
- na początku zainicjujemy wynik wartością 0,
- następnie dopóki x jest różne od 0:
- wynik = wynik + (x mod 10), czyli dodaj do wyniku wartość ostatniej cyfry,
- x = (x div 10), czyli usuń z przetwarzanej liczby ostatnią cyfrę (tej, której wartość właśnie dodaliśmy do wyniku).
Operację obliczania sumy cyfr liczby całkowitej x możemy zapisać następującym schematem blokowym:
Przykład:
Niech x będzie równe 148.
Na początku wynik ustawiamy na 0.
Dochodzimy do decyzji, czy x jest równe 0?
Nie, zatem:
wynik = wynik + (x mod 10) = 0 + (148 mod 10) = 0 + 8 = 8
x = x div 10 = 148 div 10 = 14
Sprawdzamy po raz kolejny, czy x jest równe 0?
Nie, zatem:
wynik = wynik + (x mod 10) = 8 + (14 mod 10) = 8 + 4 = 12
x = x div 10 = 14 div 10 = 1
Sprawdzamy po raz kolejny, czy x jest równe 0?
Nie, zatem:
wynik = wynik + (x mod 10) = 12 + (1 mod 10) = 12 + 1 = 13
x = x div 10 = 1 div 10 = 0
Sprawdzamy po raz kolejny, czy x jest równe 0?
Tak, zatem obliczyliśmy sumę cyfr liczby x=148, i wynik ten wynosi 13.
Przykład w JavaScript:
Dla zaawansowanych:
Przedstawiony algorytm oblicza sumę liczb dla systemu dziesiętnego. Można go jednak łatwo zaadoptować do obliczania sumy cyfr dla systemu liczbowego o dowolnej podstawie (np. dwójkowego lub szesnastkowego). W tym celu wystarczy przerobić fragment:
wynik = wynik + (x mod 10)
x = (x div 10)
na:
wynik = wynik + (x mod podstawa)
x = (x div podstawa),
gdzie podstawa jest wartością podstawy systemu liczbowego, dla którego chcemy obliczyć sumę cyfr (2 dla systemu dwójkowego, 10 dla dziesiętnego, 16 dla szesnastkowego, itp...). Jeżeli chcesz zobaczyć jak liczby dziesiętne wyglądają w innych systemach przeczytaj artykuł zamiana z i na system dziesiętny
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C# | MS Visual Studio .net | .cs | .cs | ***** / 8 |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 14 | |
Marian | C/C++ | C++ | .cpp | .cpp | ***** / 21 |
Adam CZ | C/C++ | C++, funkcja obliczająca wynik | .cpp | .cpp | ***** / 50 |
Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | .pas | .pas | ***** / 5 |
Tomasz Lubiński | Java | .java | .java | ***** / 13 | |
Tomasz Lubiński | JavaScript | .js | .js | ***** / 10 | |
Dominik Goździuk | Perl | .pl | .pl | ***** / 0 | |
_marass_ | Php | .php | .php | ***** / 5 | |
Jakub Konieczny | Python | .py | .py | ***** / 28 | |
Nikodem Solarz | Ruby | metoda obliczająca sumę cyfr dowolnej liczby z dowolnego systemu liczbowego | .rb | .rb | ***** / 0 |
Poprawiony: 27 maja 2011 07:18
Zamienić liczbę na string;
Znaleźć długość ciągu;
pętla 1 do długość
S = S + Ciąg[I];
I = I + 1;
pisaliśmy kiedyś na studiach program badający losowość generatora liczb pseudolosowych sprawdzając rozkład wartości poszczedólnych cyfrach.
Przy dużej ilości próbek kluczowe dla wydajności okazało się zamiana liczby na postać dziesiętną.
Osoba, która użyła zamiany na string miała wynik od razu a pozostałym komputery mieliły dobre kilkadziesiąd sekund.