E ae?! Hoje quero compartilhar com vocês uma jornada curiosa pelo mundo da programação, onde enfrentei um desafio no CodeWars chamado "Multiplying numbers as strings". Este desafio me levou de volta aos fundamentos da matemática, forçando-me a multiplicar números gigantescos sem depender de truques modernos ou funções avançadas, como o BigInt() do JavaScript.
Descrição do Desafio
O Kata no CodeWars é: https://www.codewars.com/kata/55911ef14065454c75000062.
O desafio é claro, inicialmente parece simples, porém complexo. Ele pede para multiplicarmos dois números enormes, tão vastos que ultrapassam qualquer limite convencional, e o detalhe mais interessante: eles são representados como strings. A tarefa é retornar o produto também como uma string, sem zeros à esquerda. Até ai, parece simples, certo? Iriamos usar o multiplicador comum ou ate mesmo o BigInt() para retornar o número e retornar uma string, porém me deparei com um detalhe importante durante os testes.
Restrição Importante
Um detalhe crucial que elevou a dificuldade do desafio foi a restrição de não usar a função nativa BigInt() do JavaScript. Esse recurso permite trabalhar com números além do limite de segurança do JavaScript de maneira relativamente simples. Sem ele, eu precisava ser ainda mais criativo e meticuloso na minha abordagem.
Minha Abordagem
Decidi reviver uma técnica da escola: a multiplicação de números como fazíamos no papel. Esse método antigo, mas confiável, envolve multiplicar cada dígito do número um pelo outro e somar os resultados intermediários corretamente. Parece simples, mas aplicá-lo a números de centenas ou milhares de dígitos foi uma jornada intrigante e educativa.
Solução Simplificada:
- Configuração: Primeiro, coloquei os números um abaixo do outro, alinhando-os à direita.
- Processo: Multipliquei cada dígito do número inferior pelo número superior, cuidadosamente alinhando e somando os resultados intermediários.
- Desafios Adicionais: Tive que garantir que não houvesse zeros à esquerda no resultado final e que cada parte do processo lidasse com as strings de números gigantescos com precisão.
Veja aqui o code que me fez passar a barreira que estava me limitando
function multiply(a, b) { // Inicialmente pego a string a e b e divido elas em um array, logo apos isso // dou um reverse para ficar mais facil as contas (na cabeça n fica, mas na programação // sim) e transformos todos aqueles números "string" em números let num1 = a.split('').reverse().map(Number); let num2 = b.split('').reverse().map(Number); // Adicionei um terceiro array de resultado completo de 0 let result = Array(num1.length + num2.length).fill(0); for (let i = 0; i < num1.length; i++) { for (let j = 0; j < num2.length; j++) { // Aqui vem a mágica, faço a multiplicação dos 2 numeros e adiono ele já com o resultado que // esta ali anteriormente result[i + j] += num1[i] * num2[j]; // caso a soma seja maior, ele "sobra" aquele 1 à esquerda, certo? no caso 1 a direita result[i + j + 1] += Math.floor(result[i + j] / 10); // e deixo o número apenas com 1 "casa" result[i + j] %= 10; } } // Retiro agora todos os 0 à esquerda while (result.length > 1 && result[result.length - 1] === 0) { result.pop(); } // faço o reverse novamente, e junto todos para retornar a string desejada return result.reverse().join(''); }
O que Aprendi
Esse desafio foi um lembrete poderoso de que não devemos depender cegamente das ferramentas e funções modernas. Às vezes, voltar ao básico pode revelar soluções inovadoras e eficazes. Aprendi muito sobre manipulação de strings, precisão numérica e, claro, sobre como manter a calma e a persistência diante de tarefas aparentemente assustadoras.
Conclusão
"Multiplying numbers as strings" foi mais do que um desafio de programação; foi uma lição sobre inovação, persistência e a beleza da matemática básica.
Obs.: Existe um outro Kata (https://www.codewars.com/kata/525f4206b73515bffb000b21) que baseia-se necessáriamente no mesmo fundamento, porem é com a adição de números grandes. Usei basicamente a mesma solução para resolver