Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Não consigo achar erros na lógica: calcular a soma dos números primos entre 2 e 10.

Olá. Estou tendo problemas para calcular a soma dos números primos entre 2 e 10. O meu código em vez de retornar a soma retorna NaN, poderiam me esclarecer? Não consigo achar erros na lógica.

<meta charset="utf-8">
<script>

    function pulaLinha(){
        document.write("<br>");
    }

    function mostra(frase){

        document.write(frase);
        pulaLinha();
    }

    function calculaNumPrimo(num){

        var quantDivisores = 0;
        for(var contador=1; contador<=num; contador++){

            var resto = num % contador;

            if(resto == 0){

                quantDivisores++;
            }

            if(quantDivisores > 2){
                break;
            }
        }

        if(quantDivisores == 2){

            return num;
        }
    }

    var somaPrimos = 0;
    for(var i=2; i<=10; i++){

        somaPrimos = somaPrimos + calculaNumPrimo(i);
    }

    mostra("Soma = " + multPrimos);
</script>
5 respostas

Oi Daniel, para resolver isso basta fazer uma alteração nessa linha aqui

if(quantDivisores > 2){
    break;
}

Deixe assim

if(quantDivisores > 2){
   return 0;
}

Mas por que isso? Do jeito que estava com o break quando um numero não era primo a função não retornava nada, desse jeito ficava como undefined e não tem como somar por exemplo 2 + undefined, fazendo a alteração os números que não são primos retornam 0, que não influenciam em nada no resultado.

Um errinho que notei no seu código também é na hora de mostrar o resultado da soma

mostra("Soma = " + multPrimos);

A variável multPrimos não existe, o resultado que guarda o resultado da soma chama somaPrimos, então deixe assim

mostra("Soma = " + somaPrimos);

Entendeu? Qualquer coisa você posta aqui. ;)

Certo! Mas e se for pra multiplicar ? Quando retornar o zero, a multiplicação irá zerar.

solução!

Hmm, boa pergunta. Para resolver isso eu fiz assim:

  • Criei um array que vai guardar o números primos, fora da função calculaNumPrimo.
var numerosPrimos = [];
  • Modifiquei a função para que invés dela retornar o número, ela o adicionasse nesse array.
        if(quantDivisores == 2){
            numerosPrimos.push(num);
        }
  • Modifiquei o for que já existia para que ele só chamasse a função várias vezes para ele ir adicionando os números no array.
    for(var i=2; i<=10; i++) {
        calculaNumPrimo(i);
    }
  • Criei uma variável chamada multiplicaPrimos igual a somaPrimos porém o valor dela começa com 1.

  • Fiz mais um for para percorrer esse array com os números primos e ir somando e multiplicando.

    for(var i = 0; i < numerosPrimos.length; i++) {
        somaPrimos = somaPrimos + numerosPrimos[i];
        multiplicaPrimos = multiplicaPrimos * numerosPrimos[i];
    }

No final é só mostrar a variável multiplicaPrimos. O código inteiro ficou assim

    function calculaNumPrimo(num){

        var quantDivisores = 0;
        for(var contador=1; contador<=num; contador++){

            var resto = num % contador;

            if(resto == 0){

                quantDivisores++;
            }

            if(quantDivisores > 2){
                break;
            }
        }

        if(quantDivisores == 2){
            numerosPrimos.push(num);
        }

    }

    var numerosPrimos = [];
    var somaPrimos = 0;
    var multiplicaPrimos = 1;

    for(var i=2; i<=10; i++) {
        calculaNumPrimo(i);
    }


    for(var i = 0; i < numerosPrimos.length; i++) {
        somaPrimos = somaPrimos + numerosPrimos[i];
        multiplicaPrimos = multiplicaPrimos * numerosPrimos[i];
    }

    mostra("Soma = " + somaPrimos);
    mostra("Multiplicação = " + multiplicaPrimos);

Note que fazendo utilizando esse array, podemos voltar com o break lá em cima e não retornar 0, mas também não tem problema caso retorne.

Muito bom!!! Obrigadão. Estou tendo dificuldades, acho que as aulas são boas mas falta listas de exercícios para praticarmos e solidificar conhecimento. Você teria alguma dica pra eu poder desenvolver melhor minha lógia e ter uma visão mais ampla?

Pratique sempre, procure por exercícios na internet ou então crie você mesmo. O que eu costumava fazer era pegar a matéria que estava estudando de matemática e fazer um programinha que calculava os exercícios, tente ai se quiser, faça algo para calcular equação de segundo grau onde o usuário passe os três valores e conforme o valor de delta você mostre o resultado, se delta for positivo: os dois, se delta for 0 mostre o resultado e se delta for negativo uma mensagem que não existe. Se você não quiser, tudo bem, tente criar algo para que resolva um probleminha da sua vida.

Com o tempo você vai ter resolvido tantos problemas que vai ficar meio repetitivo, tipo, como somar tudo que está dentro do array? Você precisa de variável que armazene o resultado, um for para passar por todo o array e que faça a operação.

Isso você vai pegando com o tempo, não se preocupe. Até.