Onde está o problema? [RESOLVIDO]

1. Onde está o problema? [RESOLVIDO]

Marcus Vinicius
marcus5rro

(usa Debian)

Enviado em 25/12/2016 - 20:32h

Meus caros, antes de mais nada, um Feliz Natal à todos.

Gostaria de saber onde esta meu erro aqui no meu código, estou tentando testá-lo, mas acaba dando um problema... vejam só o código:

Enunciado do problema:
7) Fornecido um número inteiro (n>0) verificar se "N" é um número primo, imprimir na tela "primo" caso seja, e se não for "não primo.


#include <stdio.h>
int main (void)
{

int a,n,i,cont;

cont = 0;
printf("Digite o numero:");
scanf("%d", &n);

for (i=0; (i<n) ; ++i) {
a = (n % i);
printf ("%d", a);
if (a==0){
cont =(cont +1);
}
}


if (cont<=2)
printf("Eh primo!");

if (cont>=3)
printf("Nao eh primo");

return 0;
}



Não consigo identificar o problema - aos meus olhos está tudo ok.... poderiam me ajudar?

A linguagem é: C




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/12/2016 - 09:37h

O pior erro já foi apontado (tentar dividir por zero). Mas há várias coisas que poderiam ser melhoradas no seu programa. Entre elas:

- Se o número tem de ser inteiro e maior que zero, então você poderia usar unsigned em lugar de int e ganhar um bit a mais para acomodar o dobro de possíveis casos de teste.

- Na hora de percorrer os candidatos a divisores do número, você não precisa contar de um em um. Em particular, se algum número par dividir o número testado, ele também já terá sido, anteriormente, dividido por dois.

- Você também não precisa contar até n, mas tão-somente até a raiz quadrada de n, pois qualquer divisor maior do que sua raiz quadrada será um número composto por fatores primos menores do que sua raiz quadrada.

- Assim que encontrar um dividor menor que n, você pode parar de contar, pois já sabe que o número não será primo.

- Não tenha medo de tratar casos especiais como casos especiais.


Eis um jeito de fazer seu programa mais eficiente.

unsigned n, d;
bool achou_divisor;
if(scanf("%u", &n)!=1){
fprintf(stderr, "Erro de leitura.\n");
exit(1);
}

// Caso especial: pares maiores do que 2.
achou_divisor=(n>2 && (n%2)==0);

// Testo apenas os divisores ímpares, já que os pares já foram tratados acima.
for(d=3; !achou_divisor && d*d<=n; d+=2)
achou_divisor=(n%d==0);

if(
achou_divisor ||
n<2 // Caso especial: não achou divisor para 0 e 1, mas eles não são primos
)
printf("%u não é primo.\n", n);
else
printf("%u é primo.\n", n);


3. Re: Onde está o problema? [RESOLVIDO]

Robson Mothé
rmothe

(usa Linux Mint)

Enviado em 25/12/2016 - 21:50h

O erro ocorre em:
a = (n % i); 

Caso i seja 0 gerará uma divisão por zero.
Para resolver basta substituir:
for (i=0; (i<n) ; ++i) { 

for (i=1; (i<n) ; ++i) { 

Bom, apenas resolvi o erro de execução, não estou dizendo que toda a lógica esteja correta, ok? 8)


http://klesis.com.br
https://www.linuxcounter.net/cert/318909.png


4. Obrigado

Marcus Vinicius
marcus5rro

(usa Debian)

Enviado em 26/12/2016 - 13:42h


Gostaria de deixar aqui o meu muito obrigado pelas resposta - valeu mesmo!

Aproveito e desejo um feliz ano novo...

Abraço!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts