Ir ao conteúdo
  • Cadastre-se

C Divisores de um número


Simão.
Ir à solução Resolvido por Simão.,

Posts recomendados

@Simão.   qq número pode ser dividido por qq um outro número ,  mas  creio que o que você quer mesmo dizer é quais os divisores que tenham resultado exato , sem casas decimais , e sendo isso assim mesmo , você pode usar o comando "mod" que na linguagem c é esse "%" ,  e se for zero então a divisão é exata e esse será um divisor ,

poste um código que você já tenha feito sobre esse exercício e ajudaremos se precisar  .

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

7 horas atrás, Simão. disse:

Precisava de fazer um programa que diga os divisores de um número indicado

 

Isso não seria uma dúvida sobre C C++ ou C#.

 

Considerando o ensino fundamental: 

  • todo número é divisível por 1 e por si.
  • os divisores aparecem claro aos pares: para um x dividir N tem que ter um y de forma que x*y = n. É a definição afinal.  E nesse caso conforme x cresce y diminui, o que é bem natural também.

Exemplo: divisores de 12

 

  • 1 e 12 dividem 12 por definição
  • a partir daí vão aparecer 2, 3, 4 e 6. Como são pares e a multiplicação é comutativa eles vão aparecer duas vezes: 2x6 e 6x2 3x4 e 4x3.

Então basta um loop testando os possívies fatores a partir de 2 inclusive.  Para a condição de parada: o maior fator que se pode ter é quando x*y = N e x=y, como em 16 teria 4x4. 

 

Isso acontece quando um número tem raiz quadrada inteira, no popular um quadrado perfeito. Então o loop continua até x*x maior que N certo?

 

Nada mais.

 

Considere o 12 de novo:

 

2 divide 12, e 2x2 = 4 menor que 12, continua no loop. E marca lá os fatores 2 e claro 6

3 divide 12, e 3x3 = 9 menor que 12, continua no loop. E marca lá os fatores 3 e 4

4 já está na lista e 4x4 = 16 maior que 12 então não tem mais divisor possível.

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

  • Solução
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int valor, n;
		printf("Insira um valor para verificar os seus divisores: \n");
		scanf("%d", &valor);
	for (n = 1; n < valor + 1; n++)
	{
	if (valor % n == 0)
    	printf("E devisor %d \n", n);
	}
}

Eu fiz desta forma e funciona, eu sei que existe mais alguma forma de fazer mas não sei qual, se alguém souber que disponha aqui por favor.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 horas atrás, Simão. disse:

Eu fiz desta forma e funciona, eu sei que existe mais alguma forma de fazer mas não sei qual, se alguém souber que disponha aqui por favor

Leu o que eu te expliquei logo acima? 

Não está bom assim. Não sou eu que vou corrigir isso mas imagino que vai perder nota.

 

Se leu o exemplo que eu descrevi passo a passo está vendo lá que os divisores aparecem aos pares.

 

Não tem sentido encontrar 2 como divisor de 12 e não encontrar o 6 para depois fazer a mesma cona e encontrar o 6 e não encontrar o 2. 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

20 minutos atrás, arfneto disse:

Leu o que eu te expliquei logo acima? 

Não está bom assim. Não sou eu que vou corrigir isso mas imagino que vai perder nota.

 

Se leu o exemplo que eu descrevi passo a passo está vendo lá que os divisores aparecem aos pares.

 

Não tem sentido encontrar 2 como divisor de 12 e não encontrar o 6 para depois fazer a mesma cona e encontrar o 6 e não encontrar o 2. 

 

O meu professor nem sequer falou sobre o programa quando lhe entreguei, mas vou falar com ele sobre isso. Obrigado

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 minuto atrás, Simão. disse:

O meu professor nem sequer falou sobre o programa quando lhe entreguei, mas vou falar com ele sobre isso

 

??

Estou falando sobre o que eu expliquei ontem, e de novo hoje. E nada tem a ver com C e sim com o ensino fundamental: um número divide outro então tem um terceiro como te expliquei com o exemplo 12.

 

Se já entregou esqueça isso. Mas não está bom. Espero que tenha entendido o que eu expliquei: seu programa faz duas vezes a mesma coisa e despreza o fato de que ao descobrir por exemplo que 2 divide 12 FICA CLARO que tem que ter um outro número, o 6, para o qual 2 x 6 é 12. É aritmética fundamental. Então você faz o dobro de tudo em seu programa. Não usou a condição de parada que eu te expliquei em português lá em cima...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Sobre o código:

 

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int valor, n;
		printf("Insira um valor para verificar os seus divisores: \n");
		scanf("%d", &valor);
	for (n = 1; n < valor + 1; n++)
	{
	if (valor % n == 0)
    	printf("E devisor %d \n", n);
	}
}

 

Além do que eu já te disse sobre esar fazendo duas vezes a mesma coisa...

 

  • TESTE sempre o retorno de scanf(). É ingênuo não testar e seguir adiane. Veja o manual
  • NUNCA deixe de declarar a variável de controle do loop DENTRO do loop
  • a grafia correta: "divisor"
  • não precisa e não deve incluir stdlib
     

O loop deve parar quando n for maior que a raiz quadrada de valor, já que conforme um fator diminui o outro aumenta, como no exemplo que te mostrei 2X. Para valor = 12  2x6 é o mesmo que 6x2: quando encontrou 2 como divisor de 12 tem que ter encontrado o 6 também. E não deve fazer de conta que não encontrou e pasar reto. Nesse caso nenhum valor acima de 4 deveria ser testado. E nem 4 já que 4x4 = 16 maior que 12.

 

Módulo % e raiz quadrada são operações "caras"e pode passar sem isso usando algo como o exemplo

 

EXEMPLO

 

#include <stdio.h>
int main(void)
{
    int qtd = 0;  // quantos fatores
    int valor   = 12;  // o valor
    int f1      = 1;   // um fator
    int produto = 0;   // para saber quando acabou

    printf("\nDividem %d: ", valor);
    while (produto <= valor)
    {
        int f2  = valor / f1;
        produto = f1 * f2;
        if (produto == valor)
            if (f1 == f2)
                printf("%d ", f1), qtd += 1;
            else
                printf("%d %d ", f1, f2), qtd += 2;
        f1      = f1 + 1;  // proximo candidato
        produto = f1 * f1;
    };
    if (qtd == 2)
        printf("  (%d PRIMO)\n", valor);
    else
        printf("  (%d divisores)\n", qtd);
    return 0;
}

 

que mostra para 12:
 

Dividem 12: 1 12 2 6 3 4   (6 divisores)

 

Ou para 13:

 

Dividem 13: 1 13   (13 PRIMO)

 

Lembre do ensino fundamental que essa é a definição de número primo: ter só dois divisores.

 

Ou para 60:
 

Dividem 60: 1 60 2 30 3 20 4 15 5 12 6 10   (12 divisores)

 

Ou para 25:

 

Dividem 25: 1 25 5   (3 divisores)

 

E esse é um caso particular importante porque 25 é um quadrado perfeito

  • Curtir 1
  • Obrigado 3
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!