Logo Hardware.com.br
llrafaell
llrafaell Novo Membro Registrado
21 Mensagens 1 Curtida

Numero perfeito no C

#1 Por llrafaell 24/08/2007 - 11:12
Bom Dia..
estou tentando geral um codigo para receber um internvalo informado pelo usuario por exemplo
intervalo=1 ate 9999,
os numeros ferfeitos nesse intervalo são 6,28,496,8128
quantidade = 4
um numero perfeitos e aquele que é igual a soma de seus divisores
ex 28=1+2+4+7+14
preciso imprimir somente a quantidade de numeros não é necessario so numeros

obs.
usando somente for e if/else

tipow jah fiz isso masi nun sei + o q faser...

#include
#include
int main()
{
int i, j, ini, fim, qtd;
printf("digite o intervalo inicial: ");
scanf("%d", &ini);
printf("digite o intervalo final: ");
scanf("%d", &fim);
for(i=ini; i<=fim; i++)
{
for(j=1; j<=(i/2); j++)
{
if((i%2)==0)
qtd++;
}


}
printf("%d\n\n", qtd);
system("pause");
}


alguem pode me ajudar??
obrigado
Responder
CaSt
CaSt Super Participante Registrado
573 Mensagens 5 Curtidas
#2 Por CaSt
24/08/2007 - 13:16
Primeiramente, acostume-se a utilizar as tags de código (
) para postar seus códigos .

Segundo, a lógica utilizada para checar se um número é perfeito ou não é razoávelmente simples. Na verdade, você vai precisar de uma estrutura de repetição (o for() por exemplo) que vai de 1 até o número em questão checando se esse número é divisível por cada número da iteração.
Você pode por exemplo fazer uma função "checaPerfeito(int num)" que tenha mais ou menos o esquema a seguir:

[code]
{
int sum,i;
sum = 0;
for (i=1; i < num;i++)
{
if((num%i) == 0)
sum = sum+i;
}
if (sum == num){
return 1;
}
else
return 0;
}
Aí ficou muito fácil hein? smile.png

Abs.
Linux User #394367
Asking Smart Questions

"Always remember that you are unique. Just like everyone else"
jcferranti
jcferranti General de Pijama Registrado
4.7K Mensagens 162 Curtidas
#3 Por jcferranti
24/08/2007 - 14:01
CaSt disse:
Primeiramente, acostume-se a utilizar as tags de código (
) para postar seus códigos .

Segundo, a lógica utilizada para checar se um número é perfeito ou não é razoávelmente simples. Na verdade, você vai precisar de uma estrutura de repetição (o for() por exemplo) que vai de 1 até o número em questão checando se esse número é divisível por cada número da iteração.
Você pode por exemplo fazer uma função "checaPerfeito(int num)" que tenha mais ou menos o esquema a seguir:

[code]
{
int sum,i;
sum = 0;
for (i=1; i < num;i++)
{
if((num%i) == 0)
sum = sum+i;
}
if (sum == num){
return 1;
}
else
return 0;
}
Aí ficou muito fácil hein? smile.png

Abs.


na verdade para otimizar o código, ele pode testar somente até a metad do numero escolhido, já que acima da metade de um numero não existem divisores para ele. p.ex. 30 é divisivel até 15 (MDC) e acima de 15 não existem divisores para 30.
Casa:MS Windows Seven (empolgando)
Trampo: MS Windows Seven (desapontando)

Quer um Fórum exclusivamente sobre Open Source? Aqui: www.linuxbsd.com.br/forum
CaSt
CaSt Super Participante Registrado
573 Mensagens 5 Curtidas
#4 Por CaSt
24/08/2007 - 15:10
jcferranti disse:
na verdade para otimizar o código, ele pode testar somente até a metad do numero escolhido, já que acima da metade de um numero não existem divisores para ele. p.ex. 30 é divisivel até 15 (MDC) e acima de 15 não existem divisores para 30.


Sim, sim, sim, sem dúvidas. As otimizações deixei por conta dele.
Linux User #394367
Asking Smart Questions

"Always remember that you are unique. Just like everyone else"
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#6 Por jqueiroz
24/08/2007 - 16:39
eu usei a dika de jah dividir pela metade fiko show..

Então melhore mais ainda... não é preciso ir até a metade, e sim até a raiz quadrada do número.

Tome como exemplo o número 400. Os divisores dele são: 1, 2, 4, 5, 8, 10, 16, 20, 25, 40, 50, 80, 100, 200 e 400.

Agora veja só:
1 x 400 = 400
2 x 200 = 400
4 x 100 = 400
5 x 80 = 400
8 x 50 = 400
10 x 40 = 400
16 x 25 = 400
20 x 20 = 400

Ou seja, pra cada divisor antes da raiz quadrada, há outro depois. Então você não precisa pesquisar divisores após a raiz quadrada do número. Pra números pequenos pode não fazer diferença, mas pra números grandes, faz uma diferença fantástica.
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
llrafaell
llrafaell Novo Membro Registrado
21 Mensagens 1 Curtida
#7 Por llrafaell
25/08/2007 - 08:00
aew Galera..
|Tudo Sussa|??
Aew dePois de FuncIOnar MudeI uns Bagumelos aki e Fiko AssIM...

#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i, j, ini, fim, somadiv=0, qtd=0;
printf ("DIGITE UM NUMERO INICIAL: &quot;
scanf ("%d", &ini);
printf ("DIGITE UM NUMERO FINAL: &quot;
scanf ("%d", &fim);
for ( i=ini; i<= fim; i++)
{
somadiv = 0;
for (j=1; j < i; j++)
{
if ((i%j)==0)
somadiv = somadiv + j;
}
if (i == somadiv)
qtd++;
}
printf ("\n\nNESTE INTERVALO EXISTEM %d NUMEROS PERFEITOS!!!\n\n\n", qtd);
system ("pause&quot;
}



e aew o que vc´s acharam?
fiko bom nos finar??

abraçss e obrigado pela ajuda galera..[

t+
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal