Gyakorlati alapok
Mobilszámok listázása
Az előző fejezetben a PIN-kódokat listáztuk ki. Ebben a fejezetben voltaképpen ugyanolyan jellegű és megoldású problémát vázolunk fel: kilistázzuk az összes lehetséges mobilszámot.
Amint az mindannyiunk előtt ismeretes, a mobiltelefonszám a kötelező
előhívószámokon kívül 7 db számjegyből áll. Például magyar
Telekom-hívószám esetén:
0036 - 30 - 0123456
országhívószám - tartományi hívószám - egyéni hívószám
Most az előhívószámokkal nem foglalkozunk, csakis a mobiltelefonszámok
lehetséges variációival. Ennek tartományát könnyen felvázolhatjuk, mert az
0000000 és 9999999 között változik, tehát összvariációs mennyisége
10.000.000 db.
A mobiltelefonszám tehát 7 számjegyből áll és hasonlít egy konkrét,
hétjegyű számjegyhez (például 1234567), de valójában nem az, hiszen míg
itt elméletileg megengedettek olyan számvariációk, mint például 0000000,
0001111, 0123456, addig a “klasszikus” matematikában már nem.
Tehát ez a 7 számjegy csak 7 db összeillesztett számvariáció 0 és 9 között.
A konkrét számításra a kombinatorikai lehetőségek közül az ismétléses variációt alkalmazhatjuk, mert nk képlet alapján 107 = 10.000.000. Implementációs listázó motorunk a már jól bevált egybeágyazott ciklusok, amelyekben kiválóan felhasználhatjuk az összes iterátort (i, j, k, l, m, n, o), sőt még feltételeket sem kell állítanunk.
Érdekes, bár haszontalan elmejáték, hogy miképpen oszthatja ki a mobilszolgáltató a lehetséges mobilszámokat. Nos, a teljes számegyezős mobilszámokat az eszelős bennfentesek nyilvánvalóan maguknak tartják fent (például 1111111, de szerintem a legdurvább a 0000000), ám a sorozatokat (például 1234567, 7654321, 1234321), illetve az egymás mellett lévő egyezéseket is garantáltan extraárért kínálhatják a marketingeseknek, például 1234444. Szerintem a mobilszolgáltató által definiált legkisebb egymás mellett lévő egyezés 4, esetleg 5 azonos számjegy (én már láttam 3 egyezést egyszerű mobiltelefonszámban, az tehát még nem definiált). Ezt tehát nagy valószínűséggel külön algoritmussal szűrik és osztályozzák. Ugyanakkor garantáltan nem kizárják a 0-val kezdődő mobilszámokat.
Nézzük meg a futtatható Java-kódot (bár a konzol nem fogja az összes variációt pontosan megjeleníteni a túl gyors kiírás miatt):
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++){
for(int j = 0; j < 10; j++){
for (int k =
0; k < 10; k++){
for (int l = 0; l < 10; l++){
for (int m = 0; m < 10; m++){
for (int n = 0; n < 10; n++){
for (int o = 0; o < 10; o++){
System.out.println(""+i+j+k+l+m+n+o);
}
}
}
}
}
}
}
}
}
Végeredmény:
0000000
0000001
0000002
0000003
...
9999997
9999998
9999999
Érdemes felfigyelnünk a System.out.println() függvényben lévő kezdő aposztrófokra:
System.out.println(""+i+j+k+l+m+n+o);
Nélkülük a rendszer nem karakterekként, hanem integer típusú számokként értelmezi az iterátorokat, ezért kiíráskor összeadja őket. Ezzel az eredménylistával persze nem sokat tudunk kezdeni. Futtatással ellenőrizzük le ezt az érdekességet is!