Gyakorlati alapok
Számok osztói
Az előző, a Számok oszthatósága című fejezet már bevezette az oszthatóság vizsgálatának egyik lehetséges programozás-technikai megoldását:
a kulcsalgoritmus a maradékképzést (%) hívja segítségül, hiszen ha x szám y számmal való osztásakor a maradék 0, akkor x szám osztható y számmal.
if(x % y == 0)
Ebben a fejezetben az oszthatóság tulajdonságát iteráljuk, csakhogy végre egészen érthetetlenül fogalmazzak egészen egyszerű dolgokról.
A feladat tehát érthetően megfogalmazva, hogy listázzuk ki és alapszinten az olvashatóság végett formázzuk is meg az első 20 egész szám lehetséges osztóit! Nyilvánvalóan prímszám, az amelyiknek csak önmaga és 1 az osztója, ám ezzel a szűrési feltétellel most még ne foglalkozzunk (azaz a prímszámok bent fognak maradni a listában).
A probléma megoldásához nyakánál fogva meg kell ragadnunk klasszikus for ciklusunkat, még pontosabban 2 darabot belőle. Mindkettőt iterálva a külső főciklus adagolja majd az osztandót (i), a belső alciklus pedig az osztót (j). A kulcsfontosságú feltétel a fentiek alapján: if (i % j == 0). A főciklus csökkenő irányú (int i = 20; i >= 1; i--), míg a belső növekvő és mindig az éppen aktuális i léptetőig tart (i <= j).
public class Main {
public static void main(String[] args) {
for (int i = 20; i >= 1; i--){
System.out.print(i + " osztói: ");
for(int j =
1; j <= i; j++)
if (i % j == 0){
System.out.print(j + " ");
}
System.out.println();
}
}
}
Végeredmény:
20 osztói: 1 2 4 5 10 20
19 osztói: 1 19
18 osztói: 1 2 3 6 9 18
17 osztói: 1 17
16 osztói: 1 2 4 8 16
15 osztói: 1 3 5 15
14 osztói: 1 2 7 14
13 osztói: 1 13
12 osztói: 1 2 3 4 6 12
11 osztói: 1 11
10 osztói: 1 2 5 10
9 osztói: 1 3 9
8 osztói: 1 2 4 8
7 osztói: 1 7
6 osztói: 1 2 3 6
5 osztói: 1 5
4 osztói: 1 2 4
3 osztói: 1 3
2 osztói: 1 2
1 osztói: 1
Láthatjuk, hogy a leosztásba jócskán keveredtek prímszámok (például: 7 osztói: 1 7), ám ez nem probléma, hiszen ezt a feltételt szándékosan nem kezeltük le.
Ha a kiértékelési sorrendet meg akarjuk fordítani, akkor a főciklusban a ciklusléptetés irányát növekvőre kell cserélnünk (int i = 1; i <= 20; i++):
public class Main {
public static void main(String[] args) {
for (int i = 1; i <= 20; i++){
System.out.print(i + " osztói: ");
for(int j =
1; j <= i; j++)
if (i % j == 0){
System.out.print(j + " ");
}
System.out.println();
}
}
}
Végeredmény:
1 osztói: 1
2 osztói: 1 2
3 osztói: 1 3
4 osztói: 1 2 4
5 osztói: 1 5
6 osztói: 1 2 3 6
7 osztói: 1 7
8 osztói: 1 2 4 8
9 osztói: 1 3 9
10 osztói: 1 2 5 10
11 osztói: 1 11
12 osztói: 1 2 3 4 6 12
13 osztói: 1 13
14 osztói: 1 2 7 14
15 osztói: 1 3 5 15
16 osztói: 1 2 4 8 16
17 osztói: 1 17
18 osztói: 1 2 3 6 9 18
19 osztói: 1 19
20 osztói: 1 2 4 5 10 20