Kolejną rzeczą, bez której nie ruszymy dalej z zadaniami, jest okiełznanie dzielenia modulo (czyli reszty z dzielenia). Postaramy się to wyjaśnić.
Ok, mały test:
console.log(1 % 26); //1
console.log(5 % 26); //5
console.log(15 % 26); //15
console.log(25 % 26); //25
console.log(26 % 26); //0
Taki wyrywkowy test o niczym nie świadczy, ale ja już mam to przerobione, więc zasada jest taka:
- Jeżeli to co dzielimy modulo (dzielna) jest mniejsze niż dzielnik to zwracamy liczbę bez żadnych ceregieli
- Jeżeli dzielna i dzielnik są takie same to zero (nie ma reszty z dzielenia)
- Jeżeli dzielna jest większa niż dzielnik to czarna magia (na razie).
Ok, nasza funkcja:
function modulo(dividend, divisor){
if(dividend < divisor)
return dividend;
else if(dividend === divisor)
return 0;
else
return "not implemented yet";
}
Dobra, teraz zobaczmy co i jak z dzielną większą niż dzielnik:
console.log(27 % 26); //1
console.log(28 % 26); //2
console.log(29 % 26); //3
console.log(30 % 26); //4
Wygląda jakbyśmy odejmowali dzielnik od dzielnej, jeżeli tak myślimy, to jesteśmy na dobrym tropie, ale nie do końca…
console.log(10 % 4); //2
console.log(12 % 4); //0
console.log(10 % 9); //1
console.log(30 % 9); //3
Cóż, 10 – 9 to jest 1, ale inne liczby się nie zgadzają. To jak to w zasadzie działa?
Działa tak – bierzemy dzielną większą od dzielnika i odejmujemy od niej dzielnik tak długo, aż dostaniemy coś mniejszego od dzielnika. Algorytmicznie to się zgadza, matematycznie też:
- Algorytmicznie, 10 mod 4, 10 -4 to 6, 6 – 4 to 2, pasuje
- Matematycznie: 10 podziel przez 4 bez reszty i zwróć resztę… 10/4 bez reszty to 8, reszta 2.
Możemy zatem napisać naszą funkcję:
function modulo(dividend, divisor){
if(dividend === divisor)
return 0;
else {
let result = dividend;
while(result >= divisor){
result = result - divisor;
}
return result;
}
}
Możemy sprawdzić, jak działa:
console.log(modulo(25,26)); //25
console.log(modulo(26,26)); //0
console.log(modulo(27,26)); //1
console.log(modulo(28,26)); //2
console.log(modulo(29,26)); //3
console.log(modulo(30,26)); //4
console.log(modulo(10,4)); //2
Okiełznanie modulo (nawet jeśli na początku nie zrozumiemy wszystkiego) daje nam ogromne możliwości, co zobaczymy w następnych lekcjach.