Gyakorlati alapok
Egyjegyűség, kétjegyűség, háromjegyűség megszámlálása
Ebben a rövid fejezetben a számok „számjegyűségét” számoljuk meg, tehát azt a
mennyiséget, hogy az
Univerzumban hány darab egyjegyű, kétjegyű, háromjegyű, stb. egész szám
létezik.
Ennek során a számok 10-zel való oszthatóságát rántjuk ki a varázskalapból, hiszen ez a tulajdonság egyértelműen meghatározza a keresett értékeket:
-
1 és 9 között a hányados mindig kisebb 1-nél,
-
10 és 99 között a hányados egyenlő 1-gyel vagy mindig nagyobb 1-nél ÉS kisebb 10-nél,
-
100 és 999 között a hányados egyenlő 10-zel vagy mindig nagyobb 10-nél ÉS kisebb 100-nál,
-
stb.
Gyakorlásképpen először érdemes a számításokat jegyenként szétbontani. Illetve van itt 1 másik probléma is, amely vita formájában pattant ki egyik ismerősömmel. Úgy érvelt, hogy vizsgálatkor tökéletesen elég a keresett számokat kilistáznunk és megszámolnunk. Ekkor egy for ciklust bevetve egyszerűen felsoroljuk, kilistázzuk a számokat. Egyjegyűek esetében például:
public class Main {
public static void main(String[] args){
int szamlalo = 0;
for(int i = 1; i < 10; i++){
System.out.println(i);
szamlalo++;
}
System.out.println("\nEgyjegyűek száma: " + szamlalo);
}
}
Végeredmény:
1
2
3
4
5
6
7
8
9
Egyjegyűek száma: 9
Igaz, ennél egyszerűbb semmi sem lehet, ám ekkor nincs feltétel, nincs szűrés. Szerintem 1 fokkal előnyösebb, ha sok szám közül a megfelelő feltétel beállításával szűrjük ki a keresett értékeket. Az alábbi futtatható Java-kódban alapjában véve 200-ig rohan a for ciklus, de a szűrés csak az egyjegyű számokat és mennyiségét állapítja meg:
public class Main {
public static void main(String[] args) {
int szamlalo = 0;
for(int i = 1; i <= 200; i++){
double hanyados = i / 10;
if(hanyados < 1){
szamlalo++;
System.out.println(i);
}
}
System.out.println("\nEgyjegyűek száma: " + szamlalo);
}
}
Végeredmény:
1
2
3
4
5
6
7
8
9
Egyjegyűek száma: 9
Kétjegyűek esetében pedig:
public class Main {
public static void main(String[] args) {
int szamlalo = 0;
for(int i = 1; i <= 200; i++){
double hanyados = i / 10;
if(hanyados >= 1 && hanyados < 10){
szamlalo++;
System.out.println("Kétjegyú szám: " + i);
}
}
System.out.println("\nKétjegyűek száma: " + szamlalo);
}
}
Végeredmény:
Kétjegyú szám: 10
Kétjegyú szám: 11
Kétjegyú szám: 12
Kétjegyú szám: 13
Kétjegyú szám: 14
Kétjegyú szám: 15
Kétjegyú szám: 16
Kétjegyú szám: 17
Kétjegyú szám: 18
Kétjegyú szám: 19
Kétjegyú szám: 20
Kétjegyú szám: 21
Kétjegyú szám: 22
Kétjegyú szám: 23
Kétjegyú szám: 24
Kétjegyú szám: 25
Kétjegyú szám: 26
Kétjegyú szám: 27
Kétjegyú szám: 28
Kétjegyú szám: 29
Kétjegyú szám: 30
Kétjegyú szám: 31
Kétjegyú szám: 32
Kétjegyú szám: 33
Kétjegyú szám: 34
Kétjegyú szám: 35
Kétjegyú szám: 36
Kétjegyú szám: 37
Kétjegyú szám: 38
Kétjegyú szám: 39
Kétjegyú szám: 40
Kétjegyú szám: 41
Kétjegyú szám: 42
Kétjegyú szám: 43
Kétjegyú szám: 44
Kétjegyú szám: 45
Kétjegyú szám: 46
Kétjegyú szám: 47
Kétjegyú szám: 48
Kétjegyú szám: 49
Kétjegyú szám: 50
Kétjegyú szám: 51
Kétjegyú szám: 52
Kétjegyú szám: 53
Kétjegyú szám: 54
Kétjegyú szám: 55
Kétjegyú szám: 56
Kétjegyú szám: 57
Kétjegyú szám: 58
Kétjegyú szám: 59
Kétjegyú szám: 60
Kétjegyú szám: 61
Kétjegyú szám: 62
Kétjegyú szám: 63
Kétjegyú szám: 64
Kétjegyú szám: 65
Kétjegyú szám: 66
Kétjegyú szám: 67
Kétjegyú szám: 68
Kétjegyú szám: 69
Kétjegyú szám: 70
Kétjegyú szám: 71
Kétjegyú szám: 72
Kétjegyú szám: 73
Kétjegyú szám: 74
Kétjegyú szám: 75
Kétjegyú szám: 76
Kétjegyú szám: 77
Kétjegyú szám: 78
Kétjegyú szám: 79
Kétjegyú szám: 80
Kétjegyú szám: 81
Kétjegyú szám: 82
Kétjegyú szám: 83
Kétjegyú szám: 84
Kétjegyú szám: 85
Kétjegyú szám: 86
Kétjegyú szám: 87
Kétjegyú szám: 88
Kétjegyú szám: 89
Kétjegyú szám: 90
Kétjegyú szám: 91
Kétjegyú szám: 92
Kétjegyú szám: 93
Kétjegyú szám: 94
Kétjegyú szám: 95
Kétjegyú szám: 96
Kétjegyú szám: 97
Kétjegyú szám: 98
Kétjegyú szám: 99
Kétjegyűek száma: 90
Nézzük azt a futtatható Java-kódot is, amely szintén feltételszűréssel (a for ciklus 10000-ig fut) megszámlálja az egy-, két-, és háromjegyű számokat:
public class Main {
public static void main(String[] args){
int egyJegyuSzam = 0;
int ketJegyuSzam = 0;
int haromJegyuSzam = 0;
for(double i = 1; i < 10000; i++){
if(i / 10 < 1){
egyJegyuSzam++;
}
else if((i / 10 >= 1) && (i / 10 <
10)){
ketJegyuSzam++;
}
else if((i / 10 >= 10) && (i / 10 <
100)){
haromJegyuSzam++;
}
}
System.out.println("Egyjegyűek száma: " + egyJegyuSzam);
System.out.println("Kétjegyűek száma: " + ketJegyuSzam);
System.out.println("Háromjegyűek száma: " + haromJegyuSzam);
}
}
Végeredmény:
Egyjegyűek száma: 9
Kétjegyűek száma: 90
Háromjegyűek száma: 900
A későbbiek során egyik tanítványom meglehetősen egyszerűen oldotta meg a problémát. Nem vacakolt az oszthatósággal, helyette egyenesen az értéktartományokat vizsgálta meg. Valójában így is jó, mert a feladat megoldásra került:
public class Main {
public static void main(String[] args) {
int egyjegyu = 0;
int ketjegyu = 0;
int haromjegyu = 0;
int negyjegyu = 0;
for (int i = 1; i <= 1000; i++) {
if(i < 10) egyjegyu++;
if(i > 9 && i<= 99) ketjegyu++;
if(i > 99 && i <= 999) haromjegyu++;
if(i > 999) negyjegyu++;
}
System.out.print("0-tól 1000-ig ennyi egyjegyú szám van: " +
egyjegyu + ", ennyi kétjegyű: " + ketjegyu);
System.out.print(", ennyi háromjegyű: " + haromjegyu + ",
ennyi négyjegyű: " + negyjegyu);
}
}
Végeredmény:
0-tól 1000-ig ennyi egyjegyú szám van: 9, ennyi kétjegyű: 90, ennyi háromjegyű: 900, ennyi négyjegyű: 1