Ir para o conteúdo
Ruka284

Calcular um divisor de um nº

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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++)

Editado por Opaidacriança

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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! ;)

Editado por Opaidacriança

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 é).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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. :)

Editado por thoga31

Knowledge is free! | Occasional Fortnite player

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por Rui Carlos
Indentação

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.