n % 10ven // 10ile sayının rakamlarını ayırmak; rakamların toplamını, çarpımını, sayısını ve ters sayıyı bulmak- bölenleri saymak ve toplamak, bir sayının asal ya da tam kare olup olmadığını kontrol etmek
- EBOB ve EKOK'u Öklid algoritmasıyla, 1 + 1/2 + … + 1/n gibi toplamları ise döngüyle hesaplamak
- aralıktaki tüm sayıları iç içe döngülerle denemek ve DİM sorularındaki hazır kalıpları tanımak
Bir banka kartının numarası doğru girildi mi? Bunu kontrol eden algoritma numarayı rakam rakam ayırır, rakamları toplar ve bir kalana bakar. DİM'in her bilişim sınavında «Döngü deyimi. Sayılar üzerinde işlemler» konusundan 3–4 soru bulunur; 2025–2026'daki dört sınavın üçünde yazılı programlardan biri de bu konudandı. İyi haber şu: bu soruların neredeyse hepsi birkaç hazır kalıptan kurulur — rakam döngüsü, bölen döngüsü ve Öklid algoritması. Bu ders «Döngü deyimleri: for, while, adım, break, continue ve iç içe döngüler» dersinin devamıdır.
Rakamları ayırmak: n % 10 ve n // 10
Onluk sistemde bir sayının son rakamı, sayının 10'a bölümünden kalandır; 10'a tam bölme ise bu rakamı atar: 5682 % 10 = 2, 5682 // 10 = 568. Bu iki işlemi döngüde tekrarlarsak rakamları sağdan sola tek tek alırız; sayı 0 olunca rakamlar biter.
- dson rakam (0…9)
- %bölümden kalan
- //tam bölme: kesirli kısım atılır, sayı bir basamak kısalır
Rakam döngüsünün iki temel komutu. Döngü while n > 0: koşuluyla çalışır.
- n // pow(10, k) % 10sağdan k'nci rakam (k = 0 — birler, 1 — onlar, 2 — yüzler)
- n % pow(10, k)son k rakamdan oluşan sayı
- n // pow(10, k)son k rakam atıldıktan sonra kalan sayı
Herhangi bir rakam döngüsüz de alınabilir: 5682 // 100 % 10 = 6, 5682 % 100 = 82, 5682 // 1000 = 5.
Hesaplayın: 1) 7049 % 10 ve 7049 // 10; 2) 7049 sayısının onlar ve yüzler basamağındaki rakam; 3) 30 % 10 ve 30 // 10.
Çözümü gösterÇözümü gizle
2) Onlar: 7049 // 10 % 10 = 704 % 10 = 4. Yüzler: 7049 // 100 % 10 = 70 % 10 = 0.
3) 30 % 10 = 0, 30 // 10 = 3. Son rakam 0 olabilir; rakam döngüsü onu da sayar.
- 1Kopyayı sakla
Döngüde n değişip 0 olacak. Başlangıçtaki sayı sonra gerekecekse önce
m = nyaz. - 2Başlangıç değerleri
toplam
s = 0, çarpımp = 1, sayaçc = 0, ters sayır = 0. - 3Döngü koşulu
while n > 0:— rakam kaldıkça. - 4Rakamı al ve işle
d = n % 10, sonras = s + d,p = p * d,c = c + 1,r = r * 10 + dya daif d % 2 == 0:gibi bir koşul. - 5Rakamı at
n = n // 10. Bu satır unutulursa döngü sonsuz olur.
n = 5682
s = 0
p = 1
c = 0
r = 0
while n > 0:
d = n % 10
s = s + d
p = p * d
c = c + 1
r = r * 10 + d
n = n // 10
print(s, p, c, r)▸ Beklenen çıktı
21 480 4 2865
n = int(input()) olur; burada değeri değişkene yazdık ki program tarayıcıda çalışsın.x = 3704
k = 0
m = x
while x > 0:
if x % 10 % 2 == 0:
k = k + 1
x = x // 10
print(m * 10 + k)▸ Beklenen çıktı
37042
Sınavda yukarıdaki program x = int(input()) ile başlar ve klavyeden 3704 girilir. Programın çıktısını belirleyin.
A) 37041 B) 3704 C) 37042 D) 24073 E) 37043
Çözümü gösterÇözümü gizle
3704 → 4, çift, k = 1
370 → 0, çift, k = 2
37 → 7, tek, k = 2
3 → 3, tek, k = 2
x = 0 — döngü biter. m başlangıçtaki sayıyı tutar: m · 10 + k = 37040 + 2 = 37042.
Cevap: C. Tuzak: 0 da çift rakamdır; onu unutan 37041'i seçer.
Ters sayı, palindromlar ve «tüm rakamlar tek»
Ters sayıyı kurmak için her adımda önceki sonucu 10 ile çarpıp yeni rakamı ekleriz: önceki rakamlar bir basamak sola kayar. Tersine eşit olan sayı palindromdur: 121, 4554, 7.
- rters sayı; başlangıçta r = 0
- n % 10sıradaki son rakam
Ters sayı: 5682 için r = 2, 28, 286, 2865. Palindrom testi: döngüden sonra r == m (m, başlangıçtaki sayının kopyası).
- cn'nin basamak sayısı (rakam döngüsünün sayacı)
- aeklenen rakam
a rakamını sayının başına ve sonuna yazmak.
1) 1230'un tersini bulun; 1230 palindrom mudur? 2) 4554 palindrom mudur? 3) 309 sayısının başına ve sonuna 7 rakamını yazın.
Çözümü gösterÇözümü gizle
2) r: 4 → 45 → 455 → 4554 = n, yani palindromdur.
3) 309'da c = 3 rakam var: 7 · 10³ + 309 = 7309; sona: 309 · 10 + 7 = 3097.
«Tüm rakamlar tek mi?» sorusu iki yolla cevaplanabilir: tek rakamları sayıp toplam rakam sayısıyla karşılaştırmak ya da bir bayrak değişkeni kullanmak: önce t = 1 («şimdilik hepsi tek»), çift bir rakam görülür görülmez t = 0. Aşağıdaki programda dış döngü sayıları, iç döngü ise rakamlarını dolaşır.
for n in [357, 48, 1991, 7, 5031]:
m = n
t = 1
while m > 0:
if m % 10 % 2 == 0:
t = 0
m = m // 10
if t == 1:
print(n)▸ Beklenen çıktı
357 1991 7
int(input()) ile okunur.Bölenler, asal sayılar ve tam kareler
n sayısı i'ye kalansız bölünüyorsa i, n'nin bölenidir: n % i == 0. 1'den büyük her doğal sayının en az iki böleni vardır: 1 ve kendisi.
Tam olarak iki pozitif böleni (1 ve kendisi) olan pozitif tam sayı: 2, 3, 5, 7, 11, 13, … İkiden fazla böleni olan sayı bileşik sayıdır; 1 ne asal ne de bileşiktir.
Bir pozitif tam sayının karesi olan sayı: 1, 4, 9, 16, 25, 36, …
- idenenen aday bölen
- c == 2bölen sayısı 2 ise n asaldır
Bölen döngüsü: for i in range(1, n + 1): ve içinde if n % i == 0:.
n = 60
c = 0
s = 0
t = 0
for i in range(1, n + 1):
if n % i == 0:
print(i, end=' ')
c = c + 1
s = s + i
if i % 2 == 1:
t = t + i
print()
print(c, s, t)▸ Beklenen çıktı
1 2 3 4 5 6 10 12 15 20 30 60 12 168 24
end=' ' bölenleri tek satırda yazdırır.- pow(a, 0.5)a'nın karekökü, ondalıklı sayı (
49 ** 0.5→7.0) - int(…)kesirli kısmı atar
Kök tam sayıysa a tam karedir. DİM çözümlerinde a ** (1/2) yazımı da geçer; ikisi aynıdır.
1) 36'nın kaç böleni vardır? 2) 97 asal mıdır? 3) 28'in kendisi hariç bölenlerinin toplamını bulun. 4) [30, 50] aralığında kaç tam kare vardır?
Çözümü gösterÇözümü gizle
2) 2'den 9'a kadar denemek yeterlidir (10 · 10 = 100 > 97). Bunlardan hiçbiri 97'yi bölmez; yani 97'nin yalnızca iki böleni vardır, asaldır.
3) 1 + 2 + 4 + 7 + 14 = 28 — toplam sayının kendisine eşittir (böyle sayılara mükemmel sayı denir).
4) 36 ve 49:
36 ** 0.5 → 6.0, 49 ** 0.5 → 7.0. Cevap: 2.İç içe döngüler: aralıktaki tüm sayıları denemek
Soru tek bir sayı için değil de [a, b] aralığındaki her sayı için soruluyorsa bölen (veya rakam) döngüsü başka bir döngünün içine konur: dış döngü sayıları, iç döngü bölenleri dolaşır. Sayaç (c = 0) her yeni sayı için sıfırlanmalıdır; bu yüzden dış döngünün içine yazılır.
a = 20
b = 40
k = 0
for n in range(a, b + 1):
c = 0
for i in range(1, n + 1):
if n % i == 0:
c = c + 1
if c == 2:
print(n, end=' ')
k = k + 1
print()
print('count =', k)▸ Beklenen çıktı
23 29 31 37 count = 4
c = 0 satırını dış döngünün önüne taşı ve neyin değiştiğine bak.Yukarıdaki programda if n % i == 0 kontrolü toplam kaç kez çalışır?
Çözümü gösterÇözümü gizle
Cevap: 630. √n kuralıyla deneme sayısı çok azalırdı.
EBOB, EKOK ve toplamlar
İki sayının en büyük ortak bölenini (EBOB) tüm bölenleri denemeden Öklid algoritmasıyla bulabiliriz. Algoritma şu gerçeğe dayanır: a'nın b'ye bölümünden kalan da EBOB(a, b)'ye bölünür. Yani (a, b) çifti (b, a % b) çiftiyle değiştirilebilir ve sayılar hızla küçülür.
- a % ba'nın b'ye bölümünden kalan
- b = 0kalan 0 olunca dururuz: cevap a'dır
Öklid algoritması. Ders kitaplarında çıkarma yöntemi de vardır: sayılar eşitlenene kadar büyükten küçüğü çıkar.
- a · biki sayının çarpımı
En küçük ortak kat EBOB'dan hemen bulunur.
a = 84
b = 36
p = a * b
while b != 0:
r = a % b
a = b
b = r
print(a, p // a)▸ Beklenen çıktı
12 252
Öklid algoritmasıyla EBOB(126, 84) ve EKOK(126, 84)'ü bulun. Döngü kaç kez çalışır?
Çözümü gösterÇözümü gizle
(84, 42): 84 % 42 = 0 → (42, 0) — dur.
EBOB = 42, döngü 2 kez çalıştı. EKOK = 126 · 84 / 42 = 10584 / 42 = 252.
Dizilerin toplamı ve çarpımı da aynı şemayla hesaplanır: bir toplayıcı (s = 0) veya çarpıcı (p = 1) değişken ve döngünün her adımında bir terim. Kesirlerde / kullanılır, sonuç ondalıklı sayı olur.
- s = s + 1 / is = s + 1 / itoplamın döngüdeki kalıbı
- p = p * ifaktöriyelin kalıbı (başlangıçta p = 1)
i döngü değişkenidir: for i in range(1, n + 1):.
n = 4
s = 0
p = 1
for i in range(1, n + 1):
s = s + 1 / i
p = p * i
print(round(s, 4), p)▸ Beklenen çıktı
2.0833 24
round(s, 4) sonucu virgülden sonra 4 basamağa yuvarlar.S = 1 − 1/2 + 1/3 − 1/4 toplamını hesaplayan bir döngü kurun ve S'yi bulun.
Çözümü gösterÇözümü gizle
s = s + z / i ve z = -z.i = 1: s = 1
i = 2: s = 1 − 1/2 = 1/2
i = 3: s = 1/2 + 1/3 = 5/6
i = 4: s = 5/6 − 1/4 = 7/12 ≈ 0,5833.
Aynı fikir akış şemasında «Akış şeması oluşturma: yazılı sorular» dersinde kullanılır.
| Görev | Kalıp |
|---|---|
| rakamların toplamı | s = s + n % 10, n = n // 10 |
| basamak sayısı | c = c + 1; len(str(n)) |
| ters sayı, palindrom | r = r * 10 + n % 10; r == m |
| bölen sayısı | if n % i == 0: c = c + 1 |
| asal sayı | c == 2 |
| tam kare | a ** 0.5 == int(a ** 0.5) |
| EBOB | r = a % b, a = b, b = r |
| 1 + 1/2 + … + 1/n toplamı | s = s + 1 / i |
- 1.Sayının son rakamı: d = n 10
- 2.Ters sayı: r = r * + n % 10
- 3.Bir asal sayının tam olarak böleni vardır.
- 4.EBOB(48, 18) =
- 5.1'den 100'e kadar tam karelerin sayısı:
while döngüsüyle n = 90517 sayısının rakamları toplamını ve ters sayıyı bulun ve bunları bir satırda, boşlukla ayırarak yazdırın.
n = 90517
s = 0
r = 0
# digit loop here
print(s, r)▸ Beklenen çıktı
22 71509
1'den 100'e kadar (dahil) tam olarak 3 böleni olan sayıları her biri ayrı satırda olacak şekilde yazdırın. Sonra onlara bakın: bu sayıların ortak özelliği nedir?
for n in range(1, 101):
c = 0
# count the divisors of n here
if c == 3:
print(n)▸ Beklenen çıktı
4 9 25 49
Önemli noktalar
n % 10son rakamı verir,n // 10onu atar; rakam döngüsüwhile n > 0:koşuluyla çalışır.- Toplam 0'dan, çarpım 1'den başlar; ters sayı
r = r * 10 + dile kurulur, palindrom tersine eşittir. - i, n'nin bölenidir ⇔
n % i == 0; asal sayının tam 2 böleni vardır, asallık testi içini * i <= nolana kadar denemek yeterlidir. - Tam kare:
a ** 0.5 == int(a ** 0.5); EBOB — Öklid algoritması, EKOK = a · b / EBOB. - Aralıktaki her sayı için dış döngü sayıları, iç döngü bölenleri veya rakamları dolaşır; sayaç dış döngünün içinde sıfırlanır.
Kendini test et
12 soru. Her doğru cevap XP kazandırır.