Executando verificação de segurança...
4

Só pra complementar meu outro comentário, seguem outros usos do operador %.


Obter os últimos dígitos de um número

Você até encontra "soluções" por aí que sugerem transformar o número em string e depois pegar os últimos caracteres. Mas na verdade, para obter os últimos N dígitos, só precisa pegar o resto da divisão por 10N:

var n = 1898453;
var ultimoDigito = n % 10; // 3
var doisUltimosDigitos = n % 100; // 53

Daí a solução pro clássico exercício de somar os dígitos de um número:

var n = 1234;
var soma = 0;
while (n > 0) {
    soma += n % 10; // soma o último dígito
    n = Math.floor(n / 10); // divide por 10, assim o último dígito "cai fora"
}
console.log(soma); // 10

Geralmente a solução matemática é mais rápida e eficiente do que converter o número para string e depois pegar cada caractere e converter de volta para número.

Lembrando que para números negativos, nem sempre funciona, como já comentado aqui. No caso acima, bastaria usar Math.abs(n) antes de usar %, mas claro que cada caso é um caso.


O clássico problema do caixa eletrônico

Esse é um exercício clássico que muitos já devem ter feito. A ideia da solução é relativamente simples: se o valor é 357 eu primeiro divido pela maior nota (por exemplo, 100) para saber quantas eu preciso (no caso, 3). Depois eu pego o resto da divisão por 100 (olha o % aí!), e o resultado será o valor restante (57). E a partir daí eu continuo verificando a próxima nota, e repito isso até o valor zerar.

Algumas "soluções" fazem um loop e vão subtraindo o valor da nota e incrementando um contador, mas o uso de divisão e % simplifica esse processo.

Claro, a solução abaixo é o caso mais simples, em que não há limite na quantidade de notas. E como a menor nota é 1, sempre haverá uma combinação possível. Se quiser uma solução que leva em conta a quantidade de cada nota, além de verificar quando não é possível (por exemplo, valor é 75 mas só tem notas de 100 e 50) veja aqui.

var valor = 357;
var notas = [100, 50, 20, 10, 5, 1];
let quantidades = new Map(); // Map para guardar as quantidades de cada nota
for (const nota of notas) {
    if (valor >= nota) {
        const qtd = Math.floor(valor / nota);
        valor %= nota;
        if (qtd == 0)
            continue;
        quantidades.set(nota, qtd);
        if (valor == 0)
            break; // se o valor zerou, não preciso continuar
    }
}

for (const [nota, qtd] of quantidades)
    console.log(`- ${qtd} nota${qtd == 1 ? "" : "s"} de ${nota}`);

Saída:

- 3 notas de 100
- 1 nota de 50
- 1 nota de 5
- 2 notas de 1

Pegar uma duração total em segundos e converter para horas, minutos e segundos

A menos que a linguagem já ofereça alguma lib pronta, não é difícil fazer os cálculos manualmente, e o operador % pode te ajudar:

// 12123 segundos são quantas horas/minutos/segundos?
var totalSegundos = 12123;

var horas = Math.floor(totalSegundos / 3600);
var minutos = Math.floor(totalSegundos / 60) % 60;
var segundos = totalSegundos % 60;

console.log(`${horas} horas, ${minutos} minutos e ${segundos} segundos`); // 3 horas, 22 minutos e 3 segundos

Ação específica a cada X iterações

Suponha que você quer iterar mil vezes, mas só quer fazer uma ação específica a cada 27 itens:

for (var i = 1; i <= 1000; i++) {
    if (i % 27 == 0) {
        // ação específica feita a cada 27 itens
    }
    // restante das ações
}

Criptografia

Algoritmos criptográficos costumam fazer uso extenso desse operador. Entre alguns exemplos, temos o RSA, Diffie-Hellman, etc. De forma geral, a aritmética modular possui várias características fundamentais para os sistemas criptográficos modernos.

Carregando publicação patrocinada...