Jump to content

Calcular um divisor de um nº


Ruka284

Recommended Posts

#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"

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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 😄

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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 😄

(É 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 é).

Link to comment
Share on other sites

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!

Link to comment
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.