Jump to content
Ruka284

Calcular um divisor de um nº

Recommended Posts

Ruka284

#include<stdio.h>
#include <stdlib.h>
int main()
{
int num,divisor;
printf ("\n   Introduza o numero   \n");
scanf("%d",&num);
while(num>0)
{
if (num%divisor == 0)
printf("o numero %d e divisor de %d   \n",divisor,num);
divisor++;
}
system ("PAUSE");
return 0;		 
}

quais os erros que cometi?

Share this post


Link to post
Share on other sites
Ruka284

o de sempre : uso de variáveis não inicializadas

qual foi a variável que não foi declarada.

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não disse declarada, eu disse inicializada, são coisas completamente diferentes !!!

enquanto que a primeira leva a erros de compilação, a segunda dá erros somente no momento de execução.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Ruka284

eu não disse declarada, eu disse inicializada, são coisas completamente diferentes !!!

enquanto que a primeira leva a erros de compilação, a segunda dá erros somente no momento de execução.

No meu compilador não da erros.

Peço desculpa pela interpretaçao

Share this post


Link to post
Share on other sites
HappyHippyHippo

No meu compilador não da erros.

a segunda dá erros somente no momento de execução.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

responde a esta pergunta :

- que valor tem a variável divisor ? e porque ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mundo

#include<stdio.h>
#include <stdlib.h>
int main()
{
int num,divisor;
printf ("\n   Introduza o numero   \n");
scanf("%d",&num);
while(num>0)
{
if (num%divisor == 0)
printf("o numero %d e divisor de %d   \n",divisor,num);
divisor++;
}
system ("PAUSE");
return 0;		
}

quais os erros que cometi?

divisor tem "lixo"

quando fazes:


if (num%divisor == 0)
printf("o numero %d e divisor de %d   \n",divisor,num);
divisor++;
}

divisor que tem "lixo", fica "lixo"++ ou seja continua com "lixo"

Share this post


Link to post
Share on other sites
thoga31

Outro erro: o ciclo é infinito se o utilizador introduzir um valor positivo não nulo.

Não há uma condição de paragem funcional.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Guest Markito

Talvez a pergunta seja: calcular os divisores de 1 numero!

Ando aqui á guerra com este problema e parece-me que tem que levar o ciclo for algures.

como

for(divisor=1;divisor<num;divisor++)

Edited by Opaidacriança

Share this post


Link to post
Share on other sites
thoga31

Sim, um ciclo terá de levar. Mas esse pode ser optimizado para ser 2x mais rápido (teoricamente falando).


Knowledge is free!

Share this post


Link to post
Share on other sites
Guest Markito

Sem mérito da minha parte. Apenas estive a estudar um post do thinkabout acerca deste mesmo problema.

Foi praticamente um copy & paste que fiz:

#include<stdio.h>
main()
{
int num,divisor;
printf ("Introduza o numero\n");
scanf("%d",&num);
for(divisor=1;divisor<=num;divisor++)
{
   if (num%divisor==0)
  {
   printf("o numero %d e divisor de %d\n",divisor,num);
  }
}
}

No entanto penso que compreendi...

Sim, um ciclo terá de levar. Mas esse pode ser optimizado para ser 2x mais rápido (teoricamente falando).

Então queres dizer que o ciclo for deve ser inicializado com 2 variáveis?

É isso que queres dizer?

Share this post


Link to post
Share on other sites
thoga31

Então queres dizer que o ciclo for deve ser inicializado com 2 variáveis?

É isso que queres dizer?

Nope. É matemática. Pensemos um pouco: qual é o menor divisor que um número poderá vir a ter, sem ser o 1? É o 2. Logo, o maior divisor de um número nunca será maior do que numero/2. Em código:

for(divisor=1; divisor <= num / 2; divisor++)

Pronto, é metade do ciclo que tu colocaste, e dará o mesmíssimo output ;)


Knowledge is free!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Nope. É matemática.

Se fores por esse caminho, sabes bem que os divisores de um número não são mais do que a multiplicação de todas as combinações possíveis dos valores de factorizarão do número ...

será mais rápido, possivelmente, será o melhor para uma pessoa que está a começar, acho que não :D


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Guest Markito

Mas está bem visto. Valem as dicas para nos prepararmos para programar a sério!

Obrigado

Mas mesmo assim o que o hippo disse também é válido porque será melhor algumas vezes, no meu caso, não dar passos mais compridos que as pernas.

Obrigado também Hippo! ;)

Edited by Opaidacriança

Share this post


Link to post
Share on other sites
Rui Carlos

Nope. É matemática. Pensemos um pouco: qual é o menor divisor que um número poderá vir a ter, sem ser o 1? É o 2. Logo, o maior divisor de um número nunca será maior do que numero/2.

Atenção que o próprio número é seu divisor, pelo que a parte sublinhada não está propriamente correcta (apenas estaria correcta se se estivesse a falar de divisores próprios)... Quando se usa num/2, é necessário não esquecer este pormenor, pois vai haver mais um divisor.

Se fores por esse caminho, sabes bem que os divisores de um número não são mais do que a multiplicação de todas as combinações possíveis dos valores de factorizarão do número ...

Parece-me que será suficiente pegar no divisor mais pequeno, para se saber qual o maior. Também não é preciso complicar :D

(É claro que isto só serve de alguma coisa, se deixarmos de fora o 1 e o próprio número.)


Uma outra optimização possível, seria limitar o ciclo à raiz quadrada do número, e calcular dois divisores de cada vez (se d é divisor de n, então n/d também o é).

Share this post


Link to post
Share on other sites
thoga31

Atenção que o próprio número é seu divisor, pelo que a parte sublinhada não está propriamente correcta (apenas estaria correcta se se estivesse a falar de divisores próprios)... Quando se usa num/2, é necessário não esquecer este pormenor, pois vai haver mais um divisor.

Pois, eu estava a excluir os dois divisores mais óbvios que qualquer número tem: o 1 e ele próprio. :)

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
Ruka284

#include<stdio.h>
#include <stdlib.h>
int main()
{
 int num,divisor;
 printf ("\n   Introduza o numero   \n");
 scanf("%d",&num);
 for (divisor=1;divisor<=num;divisor++)
 {
   if(num%divisor==0)
   {
     printf("o numero %d e divisor de %d   \n", divisor,num);
   }
 }
 system ("PAUSE");
 return 0;        
}

Conclusao

Edited by Rui Carlos
Indentação

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.