Jump to content

Recommended Posts

Posted
#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?

Posted

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

Posted

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

Posted (edited)

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!

Posted (edited)

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
Posted

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?

Posted

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!

Posted

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
Posted (edited)

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
Posted

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

Posted (edited)

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!

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

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.