Página 1 de 2
Ajuda em Linguagem C
Enviado: 17 Mai 2010 08:58
por trooper7
Olá pessoal, tudo beleza!?
Bom, preciso fazer uma lista de exercícios para a faculdade, em que há o seguinte problema:
Escrever os números primos entre 100 e 200 bem como a soma desses números
A única coisa que consegui até agora foi fazer o cálculo dos números primos...
Código: Selecionar todos
#include <stdio.h>
#include <conio.h>
int main (void){
int i, soma;
printf("\nNumeros primos entre 100 e 200:\n\n", i);
for(i=100; i<=200; i++){
if (i % 2 != 0)
{
printf("%d\n", i);
}
}
soma=i+1;
printf("E a soma de todos eles eh: %d", soma); // Aqui mora o problema!
getch();
}
Mas estou me embananando na hora da soma!
Tentei de várias maneiras, mas está difícil... :(Neg
Agradeço muito quem puder me ajudar nessa, galera!
Um grande abraço a todos! ;D
Ajuda em Linguagem C
Enviado: 17 Mai 2010 10:10
por Pablo César
Achei mudar como desse jeito, veja se é isso:
Código: Selecionar todos
#include <stdio.h>
#include <conio.h>
int main (void){
int i, soma;
printf("\nNumeros primos entre 100 e 200:\n\n", i);
for(i=100; i<=200; i++){
if (i % 2 != 0)
{
printf("%d\n", i);
soma=soma+i;
}
}
printf("E a soma de todos eles eh: %d", soma); // Aqui mora o problema!
getch();
}
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 10:20
por trooper7
Nossa!
Perfeito Pablo!
Maravilha amigão! Deu certinho!
A minha variável soma estava fora do if e contando +i... rs
Muito obrigado!
E vamos aos outros exercícios agora... :'( kkk
Abraços!
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 10:36
por Maligno
Detalhe: você está considerando como primo o número que for ímpar. Mas nem todos ímpares são primos. Entre 100 e 200 há vários ímpares não-primos. Veja a lista completa, nessa faixa:
101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197 e 199.
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 11:14
por trooper7
Olá maligno!
Realmente, estou pegando apenas os números ímpares no intervalo [100, 200]... :/
Acho que estou penando na verificação se o número é primo ou não!
Segue meu código:
Código: Selecionar todos
#include <stdio.h>
#include <conio.h>
int main (void){
int i, soma;
printf("\nNumeros primos entre 100 e 200:\n\n", i);
for(i=100; i<=200; i++)
{
if (i % 2 != 0)
{
printf("%d\n", i);
soma=soma+i;
}
}
printf("E a soma de todos eles eh: %d", soma);
getch();
}
Se puder me ajudar a resolver, agradeço muito!
Abraço!
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 11:35
por Maligno
Nunca fiz isso. Felizmente nunca precisei. Mas não parece ser tão difícil. A única forma de resolver o problema é estudá-lo. Na net tem tudo o que precisa. Não acredito que vá ter qualquer dificuldade. Veja na
Wikipedia. Acho que lá já deve ter tudo.
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 11:45
por trooper7
Opa Maligno!
Acho que agora consegui...
Código: Selecionar todos
#include <stdio.h>
#include <conio.h>
int main (void){
int i, soma;
printf("\nNumeros primos entre 100 e 200:\n\n", i);
for(i=100; i<=200; i++)
{
if (i%1==0 && i%i==0)
{
printf("%d\n", i);
soma=soma+i;
}
}
printf("E a soma de todos eles eh: %d", soma);
getch();
}
Claro, um número só é considerado primo quando é divisível por 1 e por ele mesmo... então é só colocar isso na condicional!
Muito obrigado pela ajuda, galera!
Ultimamente ando tão cheio de coisas na cabeça, que essas "bobeiras" acabam passando despercebidas! rs
Mais uma vez obrigado!
Abraços! ;D
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 11:52
por Maligno
Acho que você vai precisar elaborar um pouco mais esse código. Tome por exemplo o número 121. Ele é divisível por 1 e por ele mesmo. No entanto, ele também é divisível por 11. Não é primo, mas passa no seu código como se fosse.
Dica: sempre que fizer algum código, faça o possível para provar que ele está errado.

Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 13:07
por trooper7
Puts! :%
Todo número é divisível por 1 e por ele mesmo... porém os números primos obedecem SOMENTE esta condição!
E do jeito que coloquei no meu programa, ela irá imprimir na tela todos os números contidos entre 100 e 200, que sejam divisíveis por 1 e por eles mesmos, ou seja, imprime tudo! ¬¬'
Nossa, consciliando tarefas do serviço com trabalho da faculdade... nossa, é complicado! Tô ficando louco! rs
Mas obrigado pela observação Maligno! Vou tentar elaborar melhor esse programa!
Abraço!
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 13:42
por trooper7
Caramba!
Acho que AGORA eu consegui...
Código: Selecionar todos
#include <stdio.h>
#include <conio.h>
int primo(int b)
{
int i, count = 0;
for(i=1;i<b+1;i++)
{
if((b % i) == 0)
{
count++;
}
}
if(count == 2)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int i, soma;
printf("\nNumeros primos entre 100 e 200!\n\n");
for(i=100;i<=200;i++)
{
if(primo(i) == 1)
{
printf("%d\n", i);
soma=soma+i;
}
}
printf("\nE a soma de todos eles eh: %d", soma);
getch();
}
Pesquisei, rachei a cabeça, e acho que agora está tudo conforme! o/ kkk
Valeu pela força!
Abraços!
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 14:06
por Maligno
Claro que são poucos números. Mas se fosse um volume grande de dados, a performance poderia ser comprometida pelo código redundante. Então resolvi fatorar o seu código, a título de ilustração. Não precisa mudar o que já fez.
Código: Selecionar todos
#include <stdio.h>
#include <conio.h>
int primo(int b) {
int i, count = 0;
for(i=2; i<=b; i++) if(!(b%i)) count++;
return (count<2);
}
int main() {
int i, soma;
printf("\nNumeros primos entre 100 e 200!\n\n");
for(i=100; i<=200; i++) {
if (primo(i)) {
printf("%d\n",i);
soma += i;
}
}
printf("\nE a soma de todos eles eh: %d", soma);
getch();
}
Lembre-se: em C e C++, o zero é sempre falso e qualquer valor diferente de zero é verdadeiro. Essa característica ajuda a economizar código e melhora a performance, já que dispensa uma comparação.
Ajuda em Linguagem C
Enviado: 17 Mai 2010 21:45
por Pablo César
Maligno escreveu:Detalhe: você está considerando como primo o número que for ímpar.
Puts... como passou por alto isso ! Olhe que tinha entendido mas não me deparei nesse "pequeno" detalhe... rsrs
Fiquei empolgado em responder, ainda com a pressa que tinha para me preparar e ir ao dentista... acabei não atentando a esse detalhe. Ainda bem que aqui sempre podemos contar com o nosso benemérito colega Maligno. Desculpem, não foi má vontade... foi distração mesmo. Mas o importante que foi resolvido.
se fosse um volume grande de dados, a performance poderia ser comprometida pelo código redundante.
Mas ainda acho Maligno que a sua fatoração só sintetizou a quantidade de linha mas manteve o mesmo procedimento que o Thiago fez por ultimo. Estou errado ?
Também não sei, se seria conveniente verificar a possibilidade de inclusão do único número par que é primo, isto é, o número 2. Claro que sabemos que logo de cara, essa faixa não inclui o 2 mas talvez seja necessário colocar em váriáveis, ou melhor dito, permitir a parametrização do número inicial e final para que a função fosse mais flexível, aceitando números ou faixa de números variáveis, daí sim caberia fazer a comparação de faixa inicio e fim se está incluso o número dois e checar os valores se está em modo ascendentes (primeiro_parametro <= segundo_parametro) por exemplo.
Ahh mas acho que eu ja estou sendo chato... se foi fixo essa faixa, então esqueça o 2...
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 22:18
por Maligno
sua fatoração só sintetizou a quantidade de linha mas manteve o mesmo procedimento
Sim, o procedimento é o mesmo de antes. Mas como eu disse, a eliminação de uma comparação numa malha que possa eventualmente manipular porrilhões de números, pode fazer uma notável diferença de perfomance. Mas foi só uma sugestão para projetos futuros. Fatorar código é sempre uma boa idéia, um hábito saudável. Até o limite da legibilidade, claro.
único número par que é primo, isto é, o número 2.
Repare que o enunciado do problema exclui o número 2, já que pede apenas os valores entre 100 e 200.
Ajuda em Linguagem C
Enviado: 17 Mai 2010 22:21
por Pablo César
Tá cerrrto !
Re: Ajuda em Linguagem C
Enviado: 17 Mai 2010 23:09
por Maligno
Enquanto tomava banho lembrei de um detalhe: todo número é divisível por 1. Então fatorei mais um pouco e economizei uma iteração da malha.
Tá vendo? Você não foi o único que se distraiu.

Quando não se tem compromisso com o problema, que é bem o nosso caso, há o risco de deixarmos escapar algum detalhe.