Suma cyfr liczby w Pythonie i C++
Wiele zadań z liczbami sprowadza się do pytania o cyfry: jaka jest suma cyfr, ile cyfr ma liczba, jak wygląda czytana od tyłu, czy jest palindromem. Wszystkie te zadania rozwiązuje jeden prosty schemat z dwoma działaniami: resztą z dzielenia przez 10 i dzieleniem całkowitym przez 10. Warto go opanować, bo wraca później w zamianie systemów liczbowych, w zadaniach maturalnych i na olimpiadach.
Na tej stronie znajdziesz sumę cyfr, liczbę cyfr, odwracanie liczby i palindromy z kodem w Pythonie oraz C++. Każdy przykład przejdziesz krok po kroku w kursie Algorytmy z podstawy programowej: w przeglądarce, bez instalowania niczego i bez konta, z podglądem zmiennych w każdym kroku.
Przejdź sumę cyfr krok po kroku
Idea: ostatnia cyfra i jej odcięcie
W systemie dziesiętnym ostatnia cyfra liczby to reszta z dzielenia przez 10: 2026 % 10 = 6. Z kolei dzielenie całkowite przez 10 usuwa ostatnią cyfrę: 2026 // 10 = 202. Powtarzając oba kroki, odwiedzamy cyfry od końca, aż liczba spadnie do zera:
n % 10- daje ostatnią cyfrę,n // 10- odcina ostatnią cyfrę (w C++ to samo robin / 10na typieint),while n > 0- kończy, gdy cyfr już nie ma.
Suma cyfr liczby w Pythonie
n = 2026
suma = 0
while n > 0:
cyfra = n % 10
suma += cyfra
n //= 10
print("cyfra", cyfra, "zostaje", n)
print("suma cyfr:", suma) cyfra 6 zostaje 202
cyfra 2 zostaje 20
cyfra 0 zostaje 2
cyfra 2 zostaje 0
suma cyfr: 10 Prześledźmy wartości zmiennych po każdym obrocie pętli:
| obrót | cyfra | suma | n |
|---|---|---|---|
| start | - | 0 | 2026 |
| 1 | 6 | 6 | 202 |
| 2 | 2 | 8 | 20 |
| 3 | 0 | 8 | 2 |
| 4 | 2 | 10 | 0 |
Liczba obrotów pętli jest równa liczbie cyfr. Ponieważ liczby całkowite w Pythonie nie mają limitu, ten sam kod policzy sumę cyfr liczby o setkach cyfr, np. 2 do potęgi 100 (to jedno z zadań w kursie).
Liczba cyfr
Wystarczy zamiast sumować cyfry liczyć obroty pętli. Jest jedna pułapka: zero ma jedną cyfrę, a pętla while n > 0 nie wykona się dla niego ani razu. Dlatego zero trzeba obsłużyć osobno:
def ile_cyfr(n):
if n == 0:
return 1
ile = 0
while n > 0:
ile += 1
n //= 10
return ile
print(ile_cyfr(7), ile_cyfr(2026), ile_cyfr(0), ile_cyfr(1000000)) 1 4 1 7 Odwracanie liczby
Tym samym schematem budujemy liczbę czytaną od tyłu. Dotychczasowy wynik mnożymy przez 10 (robimy miejsce na nową cyfrę) i dopisujemy ostatnią cyfrę liczby:
n = 1234
odwrocona = 0
while n > 0:
odwrocona = odwrocona * 10 + n % 10
n //= 10
print(odwrocona) 4321 | obrót | n % 10 | odwrocona | n |
|---|---|---|---|
| start | - | 0 | 1234 |
| 1 | 4 | 4 | 123 |
| 2 | 3 | 43 | 12 |
| 3 | 2 | 432 | 1 |
| 4 | 1 | 4321 | 0 |
Ten wzór, “wynik razy podstawa plus cyfra”, to w gruncie rzeczy schemat Hornera. Z podstawą 2 zamiast 10 zamienia zapis dwójkowy na dziesiętny, o czym więcej na stronie systemy liczbowe.
Palindrom w Pythonie: liczba i napis
Palindrom czyta się tak samo od przodu i od tyłu: 12321, 707, “kajak”. Liczbę sprawdzamy, porównując ją z jej odwróceniem. Uwaga: odwracamy kopię liczby, bo pętla zeruje zmienną, a oryginał jest potrzebny do porównania. Napis porównujemy znak po znaku od obu końców do środka:
def czy_palindrom_liczba(n):
x = n
odwrocona = 0
while x > 0:
odwrocona = odwrocona * 10 + x % 10
x //= 10
return odwrocona == n
def czy_palindrom_napis(s):
i = 0
j = len(s) - 1
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
print(czy_palindrom_liczba(12321), czy_palindrom_liczba(1231))
print(czy_palindrom_napis("kajak"), czy_palindrom_napis("kotek")) True False
True False W Pythonie napis można też porównać z jego odwróceniem wycinkiem: s == s[::-1]. Wersja z dwoma indeksami jest jednak dokładnie tym, co trzeba napisać w C++ i w innych językach bez takiego skrótu.
Suma cyfr w C++
W C++ dzielenie dwóch liczb typu int jest całkowite, więc n / 10 działa jak // w Pythonie. Schemat zamknięty w funkcjach:
#include <iostream>
using namespace std;
int sumaCyfr(int n) {
int suma = 0;
while (n > 0) {
suma += n % 10;
n /= 10;
}
return suma;
}
int odwroc(int n) {
int wynik = 0;
while (n > 0) {
wynik = wynik * 10 + n % 10;
n /= 10;
}
return wynik;
}
int main() {
cout << sumaCyfr(2026) << endl;
cout << sumaCyfr(99999) << endl;
cout << odwroc(1234) << endl;
return 0;
} 10
45
4321 Palindromy liczbowe z przedziału od 100 do 200 w C++ znajdziemy, odwracając każdą liczbę i porównując z oryginałem:
#include <iostream>
using namespace std;
bool palindrom(int n) {
int x = n;
int odwrocona = 0;
while (x > 0) {
odwrocona = odwrocona * 10 + x % 10;
x /= 10;
}
return odwrocona == n;
}
int main() {
for (int i = 100; i <= 200; i++) {
if (palindrom(i)) {
cout << i << " ";
}
}
cout << endl;
return 0;
} 101 111 121 131 141 151 161 171 181 191 W C++ typ int mieści liczby do około 2 miliardów, więc odwracanie bardzo dużej liczby może przekroczyć zakres. W Pythonie ten problem nie występuje.
Lista kroków, pseudokod i schemat blokowy
Podstawa programowa wymaga, żeby uczeń opisywał problem specyfikacją (dane i wynik) i zapisywał algorytm listą kroków albo pseudokodem, a w szkole rysuje się też schematy blokowe. Pseudokod jest w stylu arkuszy maturalnych: ← to przypisanie, div i mod to iloraz i reszta z dzielenia całkowitego, a elementy tablic i znaki napisów są numerowane od 1 (w Pythonie od 0). Te same zapisy są w kursie przy lekcjach tematu, pod przyciskiem Algorytm.
Suma cyfr liczby
Specyfikacja. Dane: liczba naturalna n. Wynik: suma cyfr n.
Lista kroków:
- Wczytaj n. Ustaw s = 0.
- Jeśli n = 0, przejdź do kroku 5.
- Dodaj do s ostatnią cyfrę n, czyli resztę z dzielenia n przez 10.
- Odetnij ostatnią cyfrę: zastąp n ilorazem całkowitym n przez 10. Wróć do kroku 2.
- Wypisz s i zakończ.
Pseudokod:
wczytaj n
s ← 0
dopóki n > 0 wykonuj
s ← s + n mod 10
n ← n div 10
wypisz s Schemat blokowy:
Odwracanie liczby
Specyfikacja. Dane: liczba naturalna n. Wynik: liczba zapisana cyframi n w odwrotnej kolejności.
Lista kroków:
- Wczytaj n. Ustaw r = 0.
- Jeśli n = 0, przejdź do kroku 5.
- Dopisz ostatnią cyfrę n na końcu r: r = 10 · r + (reszta z dzielenia n przez 10).
- Zastąp n ilorazem całkowitym n przez 10 i wróć do kroku 2.
- Wypisz r i zakończ.
Pseudokod:
wczytaj n
r ← 0
dopóki n > 0 wykonuj
r ← r * 10 + n mod 10
n ← n div 10
wypisz r Schemat blokowy:
Najczęstsze błędy
- Zwykłe dzielenie zamiast całkowitego. W Pythonie
n / 10daje liczbę zmiennoprzecinkową (202.6), a pętlawhile n > 0dla 2026 obróci się aż 327 razy i zwróci ułamkowy, błędny wynik. Do odcinania cyfr służy//. - Utrata oryginału. Pętla zeruje
n, więc po niej nie da się już porównać liczby z odwróconą. Pracuj na kopii (x = n). - Zero ma jedną cyfrę.
while n > 0dla zera nie wykona się ani razu, więc licznik cyfr zwróci 0. Obsłuż ten przypadek osobno. - Zła kolejność w odwracaniu.
odwrocona * 10 + n % 10trzeba policzyć przedn //= 10, inaczej gubimy ostatnią cyfrę. - Liczby ujemne. Dla n < 0 pętla
while n > 0nie startuje. Najpierw weź wartość bezwzględną:n = abs(n).
Ćwicz w przeglądarce
W temacie “Cyfry liczby: suma cyfr, odwracanie, palindromy” kursu Algorytmy z podstawy programowej czekają trzy przykłady do krokowania i cztery zadania, które sprawdzają się automatycznie po uruchomieniu:
- suma cyfr dużej liczby (2 do potęgi 100),
- ile cyfr ma liczba,
- palindromy liczbowe od 100 do 200,
- liczby Armstronga trzycyfrowe (np. 153 = 1 + 125 + 27).
Przycisk Krok wykonuje jedną linię, a panel obok pokazuje aktualne wartości n, cyfra i suma, więc widać, jak liczba traci kolejne cyfry. W wersji z funkcją Krok wchodzi do jej środka, a stos wywołań pokazuje, skąd została wywołana. Dalsze algorytmy z tego samego kursu: systemy liczbowe oraz liczby pierwsze i sito Eratostenesa. Pełna lista: algorytmy z podstawy programowej.
Dla nauczycieli
Operacje na cyfrach to idealny temat na pierwsze pętle while: warunek końca jest naturalny (liczba spadła do zera), a uczniowie od razu widzą sens % i //. W BitWizards przydzielasz kurs klasie, udostępniasz tematy stopniowo i widzisz przebieg pisania kodu każdego ucznia (podgląd na żywo i odtwarzanie historii). Platforma jest darmowa dla szkół - jak zacząć. Więcej o tym, gdzie algorytmy leżą w podstawie programowej: informatyka w szkole.