Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio Javacript Matemática #4 Dízima períodica

Faça um programa que calcule a dízima períodica de uma fração e diga se é simples ou composta.

Resolva o problema, coloque o código no post e coloque o código em algum site de compilação online tipo o https://codepen.io/ ou https://jsfiddle.net/ ou https://codesandbox.io ou https://stackblitz.com/ ou qualquer outro que dê para compartilhar a página.

O primeiro que responder corretamente ganha 1000 xp (pois vai ter a resposta marcada como solucionada).

E depois de 24 horas se ninguém postar a resposta eu mesmo posto.

1 resposta
solução!

Eu me empolguei um pouco porque ando jogando Fallout e logo vai sair o próximo né. Então criei a página no estilo cyberpunk.

O css foi copiado, o javascript peguei um algoritimo quase pronto e dei uns ajustes.

Minha filosofia é: o bom programador não cria nada do zero, pega as coisas boas e monta.

O código completo está em (não deu pra colar tudo aqui):

https://codepen.io/neoandrevictor/pen/RqZPxV

$(document).ready(function(){
              $('#numerador').focus();
                $('#text').autosize();
            });

            // All the prime numbers under 1,000
            var primeNumbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];

            // Finds all the prime factors of a non-zero integer
            // a = integer
            function primeFactors(a) {
                var primeFactors = new Array(); 

                // Trial division algorithm
                for (var i = 0, p = primeNumbers[i]; i < primeNumbers.length && p * p <= a; i++, p = primeNumbers[i]) {
                    while (a % p == 0) {         
                            primeFactors.push(p);

                            a /= p;
                    }
                }

                if (a > 1) {
                    primeFactors.push(a);
                }

                return primeFactors;
            }

            // Converts a fraction to a decimal
            // i = number
            // n = numerator
            // d = denominator

            function fractionToDecimal(n, d) {
                var pFS = primeFactors(d);
                for (var i = 0; i < pFS.length; i++) { // Go through each of the denominators prime factors

                    if (pFS[i] !== 2 && pFS[i] !== 5) { // We have a repeating decimal

                        var output = new Array();
                        var ns = new Array();

                        // Let's find the repeating decimal
                        // Repeating decimal algorithm - uses long division
                        for (var i = 0; i < 20; i++) { // For now find 20 spots, ideally this should stop after it finds the repeating decimal
                            // How many times does the denominator go into the numerator evenly
                            var temp2 = parseInt(n / d);

                            if (ns[n] === undefined) {
                                ns[n] = i;
                            } else {
                                if (output.slice(ns[n]).join('')==0){

                                    return output.slice(0, 1).join('') + '.' + output.slice(1, ns[n]).join('');
                                } else {

                                    if  (output.slice(1, ns[n]).join('')!=''){
                                        return "Dízima periódica composta: " +  output.slice(0, 1).join('') +  '.' +      output.slice(1, ns[n]).join('') +      '[' + output.slice(ns[n]).join('') + ']' ;
                                    } else {
                                        return "Dízima periódica simples: " +  output.slice(0, 1).join('') +  '.' +      output.slice(1, ns[n]).join('') +      '[' + output.slice(ns[n]).join('') + ']' ;
                                    }
                                 }
                            }

                            output.push(temp2);
                            var n = n % d;
                            n += "0";
                        }           
                        return "Dízima periódica simples: " + output;
                    }
                }

                // Terminating decimal
                return n / d;
            }



            function main(){

              numerador=document.getElementById("numerador").value;
              denominador=document.getElementById("denominador").value;
              resultado=fractionToDecimal(numerador, denominador);
              document.getElementById("resultado").innerText=resultado;

            }