0 szavazat

1 válasz

0 szavazat
(200 pont) által 

function prim(num) {
var j = 0;
for (i = 1; i <= num; i++) {

if (num % i == 0) {
  j++;
} else {

}

}
if (j == 2) {

return document.write("Prímszám.");

} else {

return document.write("Nem prímszám.");

}
}

(260 pont) által 
Gergő válaszában vannak jó gondolatok, de ennél lehet jóval hatékonyabb függvényt is írni annak eldöntésére, hogy a paraméterben kapott szám prím-e.

Először is definiáljuk mi az, amit vizsgálunk, tehát mi az, hogy prímszám. Prímszám: olyan természetes szám, amelynek pontosan két osztója van (az 1, és  önmaga). Fontos megjegyezni: ez alapján az 1-et nem tekintjük prímszámnak, mert bár osztható 1-el, és önmagával is, de mivel 1 === önmaga, ezért az osztóinak száma 1, nem 2.

Ha jól értem, Gergő gondolatmenete az, hogy megszámoljuk a szám osztóinak a számát (`j`) egy for ciklus segítségével, majd ellenőrízzük: ha ez a szám pont 2, akkor prímről van szó, különben nem.

Az első, amin én változtatnék, hogy `document.write` helyett és `true`-val, illetve `false`-szal térnék vissza, bár ez erősen felhasználásfüggő kérdés. Ha viszont maradunk a logikai (`boolean`, `true`/`false`) értékeknél, akkor az utolsó 5 sor egy sorban is megírható, pl.: `return j === 2;`

További észrevételem, hogy az üres `else` ág teljesen felesleges a for ciklusban, tehát ki lehet törölni.

Matematikailag nem nehéz belátni, hogy egy `x` természetes számnak nincs osztója `x/2`, és `x` között, tehát pl. `20`-nak nincs osztója `10`, és `20` között (a két végértéket nem számítjuk bele). Ennek szellemében nem kell `i`-nek egészen `num`-ig elmennie, elég a feléig.

Hasonlóan be lehet látni, hogy igazából a feléig sem kell elmenni, elég a négyzetgyökéig (pontosabban annak a felső egészrészéig).

Ezen kívül van még egy fontos optimalizációs lehetőség: ha már a 3. osztót is megtaláltuk, akkor felesleges a cikluson végigmenni, mert akkor már biztosan tudhatjuk, hogy nem prímről van szó.

Ezeket figyelembe véve, én egy ehhez hasonló megoldást javasolnék:
`function isPrime(num) {
    var sqrtnum = Math.ceil(Math.sqrt(num));
    var prime = num !== 1;
    for(var i = 2; i < sqrtnum; i++) {
        if(num % i === 0) {
            prime = false;
            break;
        }
    }
    return prime;
}`

Ezen az oldalon találsz még néhány érdekes megoldást: https://stackoverflow.com/questions/40200089/number-prime-test-in-javascript
...