Estou precisando de uma ajudinha no meu trabalho de logica e matematica de programação
Estou precisando especifamente resolver esse problema: “Escreva um algoritimo que imprima todos os numeros primos existentes entre N1 e N2 que são numeros naturais fornecidos pelos usuários, deixando o código com o maior número de comentários possíveis para explicar o procedimento.”
Ou seja, o usuario entra com os dois valores, entao os numeros entre eles o algoritimo deverá calcular todos os numeros que sao primos (que sao aqueles divididos por dois numeros somente, por 1 e por ele mesmo)
O professor deu a dica de usar o loop for, e o bool (Esse é facultativo, pode usar ou não essa função)
Procura o algoritmo de Fermat. Não vai ter uma boa performance, mas a implementação é trivial, e se baseia justamente em loops.
M
MaikoID
uai tenta escrever um código ai que nós te ajudamos… mas primeiro você precisa escrever algo né. È bem simples isso ai se for para um intervalo pequeno e de números pequenos.
Abraço.
E
enantiomero
Use o crivo de Eratóstenes. Ele é razoavelmente simples de implementar.
Se você procurar no Google por “crivo de Eratóstenes” ou “sieve of eratosthenes” é relativamente fácil encontrar implementações desse algoritmo.
J
J-Chist
enantiomero:
Use o crivo de Eratóstenes. Ele é razoavelmente simples de implementar.
Se você procurar no Google por “crivo de Eratóstenes” ou “sieve of eratosthenes” é relativamente fácil encontrar implementações desse algoritmo.
Pro seu problema, o crivo pode ser melhor mesmo. O teorema de Fermat é mais fácil, dá pra implementar em 4 linhas, mas você vai ter que testar cada número no intervalo.
Eu não lembro qual dos teoremas de Fermat que é (o pequeno, o último, etc), é aquele que diz que se um o módulo de um certo produto por um número p for igual a 2, p é primo. Eu tenho uma implementação dele aqui, em Java (que usa as tais 4 linhas). Se quiser, coloca aí o que você já fez que eu vou te ajudando.
Fazer o teste de primalidade dessa maneira é adequado quando você quer checar se um dado número é primo, mas quando você tem uma sequência de números usar o crivo é mais rápido.
O problema do “pequeno teorema de Fermat” é que ele diz se um número é composto, mas não afirma categoricamente se um número é primo. Por exemplo, 1105 (que é claramente divisível por 5) é considerado como primo se você usar “a” = 2.
importjava.math.BigInteger;classTestePrimalidadeFermat{publicstaticbooleanfermatPrimalityTest(longn){returnBigInteger.valueOf(2).modPow(BigInteger.valueOf(n-1),BigInteger.valueOf(n)).equals(BigInteger.ONE);}publicstaticbooleanfermatPrimalityTest(longa,longn){returnBigInteger.valueOf(a).modPow(BigInteger.valueOf(n-1),BigInteger.valueOf(n)).equals(BigInteger.ONE);}publicstaticvoidmain(String[]args){// Positive testsSystem.out.println(fermatPrimalityTest(13));System.out.println(fermatPrimalityTest(2147483647L));System.out.println(fermatPrimalityTest(2971215073L));// Negative testsSystem.out.println(fermatPrimalityTest(600851475147L));// Atenção, os "pseudo-primos de Fermat" falham neste teste.System.out.println(fermatPrimalityTest(1105L));// veja em http://mathworld.wolfram.com/FermatPseudoprime.html// Portanto, se realmente você quer saber se um número é primo, você precisa variar os valores de a.// Para cada valor de "a", sendo "a" primo, a probabilidade de um número ser composto sendo que // passa pelo teste de primalidade de Fermat diminui.System.out.println(fermatPrimalityTest(13,1105L));// imprime "false" porque não é um pseudoprimo de Fermat para a = 13.}}
J
J-Chist
enantiomero:
Fazer o teste de primalidade dessa maneira é adequado quando você quer checar se um dado número é primo, mas quando você tem uma sequência de números usar o crivo é mais rápido.
[/code]
Calma, cara. O tópico está aberto pra todos que querem ajudar, e não acho que ter mais de uma opção de implementação prejudique o autor do tópico, pelo contrário permite a ele escolher qual ele deseja usar. Se você não notou, no meu segundo post eu falo que o crivo pode ser melhor pro problema do cara. Além disso, a minha implementação do teorema de Fermat não usa BigInteger, nem reconhece 1105 como primo. Eu fiz a minha própria implementação, não procurei no Google.