Gyakorlati alapok
Bekért szám osztói
Az egyik, 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 egy bekért szám oszthatóságát, még pontosabban osztóit listázzuk ki, sőt +1 feladatként meg is számoljuk azokat, ha esetleg gyermekünk spontán rákérdezne arra a trivialitásra, miszerint "Apa, n számnak hány lehetséges osztója van, ha beleértem önmagát és az 1-et is?"
Egyúttal a bekérést ellenőrizzük is: nem engedjük meg a felhasználónak, hogy ne pozitív számot adjon meg (while (szam <= 0)).
A probléma megoldásához importálnunk kell a bekérésért felelős előre gyártott függvényeinket (import java.util.Scanner;), majd a kötelező kasztolási rutin után (nextLine() és parseInt()) nyakánál fogva meg kell ragadnunk klasszikus for ciklusunkat és gátlástalanul iterálnunk őt azt éppen a keresett számig (int i = 1; i <= szam; i++). Az utóbbi lesz az osztandó (szam), a ciklusléptető pedig az osztó (i). A kulcsfontosságú feltétel a fentiek alapján: if (szam % i == 0). Az alábbi megoldás még nem tartalmazza az osztók számlálóját:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
System.out.println ("Kérem adja meg a számot!");
String bekeres = in.nextLine();
int szam = Integer.parseInt(bekeres);
while (szam <= 0){
System.out.println("Kérem, hogy csak
pozitív egész számot adjon meg!");
bekeres = in.nextLine();
szam = Integer.parseInt(bekeres);
}
for (int i = 1; i <= szam; i++){
if (szam % i == 0){
System.out.print(i + " ");
}
}
}
}
Végeredmény (például):
Kérem adja meg a számot!
0
Kérem, hogy csak pozitív egész számot adjon meg!
10
1 2 5 10
Most pedig gyermekünk égi kíváncsiságának kielégítésére építsük be végre az osztók számlálóját. Ez nem lesz oly nehéz: a feltétel alá kell egy léptető jellegű számlálót tenni (szamlalo++) és a ciklus végén az eredményt kiírni. A számláló értéke természetesen tartalmazza magát a keresett számot és az 1-et:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int szamlalo = 0;
Scanner in = new Scanner (System.in);
System.out.println ("Kérem adja meg a számot!");
String bekeres = in.nextLine();
int szam = Integer.parseInt(bekeres);
while (szam <= 0){
System.out.println("Kérem, hogy csak
pozitív egész számot adjon meg!");
bekeres = in.nextLine();
szam = Integer.parseInt(bekeres);
}
for (int i = 1; i <= szam; i++){
if (szam % i == 0){
System.out.print(i + " ");
szamlalo++;
}
}
System.out.print("\nA keresett
számnak " + szamlalo + " osztója van.");
}
}
Végeredmény (például):
Kérem adja meg a számot!
30
1 2 3 5 6 10 15 30
A keresett számnak 8 osztója van.
Ha azt akarjuk, hogy a számláló értéke ne tartalmazza magát a keresett számot és az 1-et, akkor a feltételmegadást kell szigorítanunk:
if(szam % i == 0 && i != 1 && i != szam)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int szamlalo = 0;
Scanner in = new Scanner (System.in);
System.out.println ("Kérem adja meg a számot!");
String bekeres = in.nextLine();
int szam = Integer.parseInt(bekeres);
while (szam <= 0){
System.out.println("Kérem, hogy csak
pozitív egész számot adjon meg!");
bekeres = in.nextLine();
szam = Integer.parseInt(bekeres);
}
for (int i = 1; i <= szam; i++){
if (szam % i == 0 && i != 1 && i !=
szam){
System.out.print(i + " ");
szamlalo++;
}
}
System.out.print("\nA keresett
számnak " + szamlalo + " osztója van.");
}
}
Végeredmény (például):
Kérem adja meg a számot!
30
2 3 5 6 10 15
A keresett számnak 6 osztója van.