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
pmg

Conclusao

Ok. Parabens!

Proximo passo para melhoria: indentacao :)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Obrigado.

Que melhoria podia fazer na indentaçao, podes-me mostrar s.f.f.

a indentação no seu fundamental não me parece errada, cada scope com o seu espaçamento, espaçamento de 2 é usado sem problemas (se bem que 4 é mais comum), boa localização das chavetas

(parece que estás a aprender a indentar o código, parabéns)

mas se quiseres então pequenas correcções, então aqui vai : tens de ser mais coerente !!!

#include<stdio.h> // dar um espaço entre o comando do pré-compilador #include e o seu comando
#include <stdlib.h>
int main()
{
 int num,divisor; // dar um espaço após a virgula para se tornar mais legível a existência de duas variáveis
 printf ("\n   Introduza o numero   \n"); // ou dás espaço após o nome da função ou não ... vê como tens na linha seguinte
 scanf("%d",&num);

 // usar espaços para facilitar a leitura
 // - entre intruções
 // - operadores
 // verifica também o espacamento entre o "for" e o abrir de parênteses
 for(divisor = 1; divisor <= num; divisor++) // <-- alterado
 {
   if(num%divisor==0) // novamente não tens a separação pelos operadores
   {
     printf("o numero %d e divisor de %d   \n", divisor,num); // dar espaço após a virgula
   }
 }
 system ("PAUSE"); // não usar a função system, usa o getchar, é 1000% mais portável
 return 0;
}


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

Share this post


Link to post
Share on other sites
Rui Carlos

Como alguns devem saber, temos um bug no IPB que espaços no início da linha. Não sei o Ruka284 tinha usado indentação originalmente, mas de qualquer modo, já a corrigi.

Share this post


Link to post
Share on other sites
Ruka284

a indentação no seu fundamental não me parece errada, cada scope com o seu espaçamento, espaçamento de 2 é usado sem problemas (se bem que 4 é mais comum), boa localização das chavetas

(parece que estás a aprender a indentar o código, parabéns)

mas se quiseres então pequenas correcções, então aqui vai : tens de ser mais coerente !!!

#include<stdio.h> // dar um espaço entre o comando do pré-compilador #include e o seu comando
#include <stdlib.h>
int main()
{
 int num,divisor; // dar um espaço após a virgula para se tornar mais legível a existência de duas variáveis
 printf ("\n   Introduza o numero   \n"); // ou dás espaço após o nome da função ou não ... vê como tens na linha seguinte
 scanf("%d",&num);

 // usar espaços para facilitar a leitura
 // - entre intruções
 // - operadores
 // verifica também o espacamento entre o "for" e o abrir de parênteses
 for(divisor = 1; divisor <= num; divisor++) // <-- alterado
 {
if(num%divisor==0) // novamente não tens a separação pelos operadores
{
  printf("o numero %d e divisor de %d   \n", divisor,num); // dar espaço após a virgula
}
 }
 system ("PAUSE"); // não usar a função system, usa o getchar, é 1000% mais portável
 return 0;
}

obrigado pela correçao, peço desculpa se transmito algo.

Não percebi essa do coerente, la tens os teus motivos, respeito-os.

Mas agradeço a tua disponibilidade sempre que meto aqui um programa, o meu obrigado

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • 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.