Exceles prímszám-vizsgálat igazi fanatikusoknak

2016. június 02. - Office Guru

A matematika iránti amatőr és semmilyen tudományos elismerésben ki nem teljesedő vonzódásom adja a mai poszt témáját, méghozzá egy alapvetően egyszerűnek tűnő kérdésből kiindulva - Excelben kinek milyen módszere van annak megállapítására, hogy egy szám prímszám-e vagy sem? A prímek ugyebár azok a természetes számok, amelyeknek mindösszesen két osztójuk van, saját maguk és 1. Ilyen például az egyetlen páros prímszám a 2 vagy mondjuk a 19, a 7 vagy a 23.

A kérdés nem újkeletű, már sok-sok évvel ezelőtt is voltak Excel-guruk, akik előjöttek ilyen-olyan megoldásokkal, a mostani kérdés igazából a legegyszerűbb és legrövidebb utat keresi az Excelben, legyen szó akár VBA-ról, akár formuláról - én most elsőként egy VBA-kódot fogok bemutatni, de kommentben jöhet bármilyen javaslat és ötlet.

Mit fogunk tenni? Magán az Excel munkalapon elég egyszerű a kérdés, az A1 cellába beírunk egy számot, VBA-ban pedig készítünk egy funkciót, amelynek egyetlen paramétere az A1 lesz és a funkció visszaad egy TRUE vagy FALSE értéket, attól függően, hogy prímszám van az A1 cellában vagy sem.

Szóval ALT+F11 lenyomásával átmegyünk VBA-editorba, beszúrunk egy modult, majd létrehozunk egy PRIM nevű funkciót:

 

prim1.jpgAzt már a korábbi posztok vagy saját tapasztalat alapján valószínűleg elég sokan tudják, hogy miért Boolean lett az eredmény adattípusa, hiszen ez a típus tárol True vagy False értékeket, a paraméterként megadható számunk pedig Integer lesz.

Miután a kód egy For..Next ciklussal fog operálni, szükségünk van egy változó deklarálására is, ez lesz most az i változó, Integer típussal.

Ezután következzen egy If utasítás, amelyben két roppant egyszerű feltételt fogunk megvizsgálni, egyrészt, hogy a számunk kisebb-e mint kettő (tehát 1) illetve, hogy a számunk osztható-e maradék nélkül kettővel (feltéve, hogy a szám maga nem a kettes, mert kettő prímszám):

If Szam < 2 Or (Szam <> 2 And Szam Mod 2 = 0) Then Exit Function

Figyeljünk fel két dologra: Szam Mod 2 = 0 a Mod operátort használja fel, amely az elsőként megadott számot (szam változó) elosztja a másodikként megadott számmal (2) és visszaadja a maradékot, itt pedig azt vizsgáljuk, hogy ez a maradék nulla-e. A másik az Exit Function lépés, amely Boolean típusú funkciónál, ha előtte nem állítottuk be másként, alapból False értéket dob majd vissza - jelen esetben pedig ezt akarjuk, hiszen a maradék nélkül kettővel osztható számok biztos nem prímek, ahogy egy sem.

Vegyük észre azt is, hogy ha az egész If utasítást egy soron tüntetjük fel, akkor nincs szükség End If lezárásra.

prim2.jpgA kódunk másik részében pedig a For...Next ciklust fogjuk használni, amelyben egyszerűen nem mást fogunk tenni, mint háromtól kezdődően egészen számunk négyzetgyökéig elvégezzük azt az osztást, amelyben a számunkat elosztjuk i értékével és ha nullát kapunk, akkor ismét Exit Functionnel kilépünk a funkcióból és FALSE értéket adunk vissza, ellenkező esetben funkciónk TRUE értékkel zárul.

Step 2 utasítás azt jelenti a For ciklusunk első sorában, hogy kettesével lépkedünk a ciklusban, azaz 3,5,7..stb. követi egymást egészen számunk négyzetgyökéig.

prim3.jpg

prim4.jpgÉs kész is vagyunk, teszteljük nyugodtan, elvileg jól működik, kommentben pedig jöhetnek az egyéb ötletek, megoldási javaslatok!

Function Prim (Szam As Integer) As Boolean
Dim i As Integer
If Szam < 2 Or (Szam <> 2 And Szam Mod 2 = 0) Then Exit Function
For i = 3 To Sqr(Szam) Step 2
If Szam Mod i = 0 Then Exit Function
Next
Prim = True
End Function

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr728773908

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.