Ir ao conteúdo

Posts recomendados

Postado

Faca um algoritmo que encontre o primeiro multiplo de 11, 13 ou 17 após um número dado (lido) no dev c++

 

Gente não consigo fazer esse de jeito nenhummmm

  • Curtir 1
  • 3 anos depois...
Postado

Sei que a pergunta é meio antiga, mas melhor um pergunta antiga respondida do que uma eterna duvida.

Eu fiz esse programa em C, e aqui vai uma explicação rapidinha do que eu fiz:

Primeiro, temos que entender a pergunta. Ele quer que achar os primeiros múltiplos de 11, 13 e 17 a partir de um numero digitado pelo usuário, sendo assim temos que ler esse numero e começar a contar a partir dele e achar os primeiros múltiplos dos números 11, 13, 17 (não nessa ordem especificamente). O que eu fiz foi, ler o numero do usuário, usar um loop while, uma variável que conta os divisores (nós só queremos 3, o primeiro de 11, 13 e 17), criei um vetor (array) para guardar os múltiplos (sendo a posição 0 para o 11, a 1 para o 13 e a 2 para o 17) e usei a logica de que se o numero for divisível for tal(11, 13 ou 17) e a posição do vetor estiver valendo 0, ele vai atribuir o valor de i para aquela posição do array e vai contar +1 para os divisores. A posição do vetor estar zerada quer dizer que ainda não foi atribuído nenhum numero para lá, e se ela não for 0 quer dizer que o primeiro múltiplo já foi descoberto.

 

Código:
 

#include <stdio.h>

int main()
{
    int i, numero, divisores, multiplos[3];

    for (i = 0; i < 3; i++)
    {
        multiplos[i] = 0;
    }

    printf("Numero: ");
    scanf("%d", &numero);

    divisores = 0;
    i = numero;
    while (divisores < 3)
    {
        if (i % 11 == 0 && multiplos[0] == 0)
        {
            multiplos[0] = i;
            divisores++;
        }

        if (i % 13 == 0 && multiplos[1] == 0)
        {
            multiplos[1] = i;
            divisores++;
        }

        if (i % 17 == 0 && multiplos[2] == 0)
        {
            multiplos[2] = i;
            divisores++;
        }

        i++;
    }

    printf("primeiro multiplos (11,13,17): %d, %d, %d", multiplos[0], multiplos[1], multiplos[2]);

    return 0;
}

 

Para traduzir para o C++ é o só trocar a biblioteca padrão para iostream e printf e scanf por cout e cin (lembrando de fazer as devidas alterações como using namespace std; e <<, >>).

Código no GitHub:

https://github.com/phzsantos/Learning_C/blob/main/02 - Estruturas de repeticao/Exercicios/26 - Exercicio.c

  • Curtir 1
  • Membro VIP
Postado
Em 03/04/2018 às 14:31, Bianca Gomes disse:

Faça um algoritmo que encontre o primeiro múltiplo de 11, 13 ou 17 após um número dado (lido) no dev c++

 

@phzsantos, vamos tentar reabordar o tema:
 

1 hora atrás, phzsantos disse:

Primeiro, temos que entender a pergunta.

 

 

Sobre:

1 hora atrás, phzsantos disse:

Ele quer que achar os primeiros múltiplos de 11, 13 e 17 a partir de um numero digitado pelo usuário,

 

Então, pelo que eu entendi, ele não quer "e" (conjunção), ele pediu simplesmente o primeiro para para um dos casos... seria "ou" (disjunção) mesmo. Observação: mesmo se fosse "e", seria "o múltiplo", no singular, ou seja, "o" primeiro para cada número.

 

Entendi assim:

leu 10? A resposta será 11

leu 12345? A resposta será 12350

leu 13? A resposta será 17

etc

  • Curtir 2
  • Obrigado 1
Postado

@Simon Viegas Rapaz, pior que eu errei mesmo hehe, refiz o código e ficou ainda mais simples. O código anterior fica pra quem quer os 3 primeiros múltiplos dos 3 números a partir do número fornecido pelo usuário.
 

#include <stdio.h>

int main()
{
    int i, numero, divisor, multiplo;

    printf("Numero: ");
    scanf("%d", &numero);

    divisor = 0;
    for (i = numero; divisor < 1; i++)
    {
        if (i % 11 == 0 || i % 13 == 0 || i % 17 == 0)
        {
            multiplo = i;
            divisor++;
        }
    }

    printf("Primeiro multiplo: %d", multiplo);

    return 0;
}

 

  • Obrigado 1
Postado

Dá para deixar mais simples com do...while e sem if. Com o operador AND o loop termina quando um dos módulos for igual a zero.

 

do{
    n += 1;
}while(n % 11 && n % 13 && n % 17);

 

  • Curtir 1
Postado

@Midori Realmente bem mais simples. Eu ainda não cheguei nesse nível aí hehe.

 

E meu algoritmo ainda está errado. Ele pega o primeiro múltiplo, até se ele for o próprio número digitado. Por exemplo:

 

Número digitado: 11

Ele pega o 11 como primeiro múltiplo. O certo seria ele pegar o 13. 

 

Pra corrigir isso no meu código, é só na hora de atribuir o i, colocar i = número + 1. Porém, vou trocar para a forma que você colocou acima, bem mais simples. Não conhecia esse operador "+=" e também não conhecia essa forma de escrever uma condicional sem comparar valores.

 

 

  • Curtir 1
  • Membro VIP
Postado
1 hora atrás, phzsantos disse:

Número digitado: 11

Ele pega o 11 como primeiro múltiplo. O certo seria ele pegar o 13. 


Já ia comentar, seria do próximo em diante. Exemplo:

 

#include <stdio.h>

int main()
{
    int i, numero, multiplo, achou;

    printf("Numero: ");
    scanf("%d", &numero);

    achou = 0;
    
    for (i = numero+1; !achou; i++)
    {
        if (i % 11 == 0 || i % 13 == 0 || i % 17 == 0)
        {
            multiplo = i;
            achou = 1;
        }
    }

    printf("Primeiro multiplo: %d", multiplo);

    return 0;
}

 


Baseando-se pelo código do @Midori:

 

#include <stdio.h>

int main()
{
    int i, numero;

    printf("Numero: ");
    scanf("%d", &numero);

    i = numero;
    
    do {
        i += 1;
    } while (!(i % 11 || i % 13 || i % 17));

    printf("Primeiro multiplo: %d", i);

    return 0;
}

 

  • Amei 1
Postado

@phzsantos Todos os loops (while/do...while/for) vão rodar enquanto a parte da expressão testar verdadeira. Em C tudo que é diferente de zero é verdadeiro e o que é zero é falso. Na expressão AND (&&) só existe verdade quando os operandos forem verdadeiros, então no tesde dos módulos o loop encerra quando qualquer um retornar o resto zero.

32 minutos atrás, Simon Viegas disse:
} while (!(i % 11 || i % 13 || i % 17));

Assim não dá certo porque OR vai ser verdadeiro inclusive para todos os módulo com resto. E o loop termina ao negar isso.

  • Amei 1
Postado

@Simon Viegas Usando a lógica de @Midori eu fiz o código desse jeito:
 

#include <stdio.h>

int main()
{
	int numero;

	printf("Numero: ");
	scanf("%d", &numero);

	do
	{
		numero++;
	}
	while (numero % 11 && numero % 13 && numero % 17);

	printf("Primeiro multiplo: %d", numero);

	return 0;
}


Eu não usei o operador += porque não precisava nessa ocasião, mas com certeza irei fazer o uso dele em outras situações no futuro.

  • Confuso 1
Postado
2 horas atrás, phzsantos disse:
    while (numero % 11 && numero % 13 && numero % 17);

 

 

numero % n vale algo entre 0 e n exclusive.

 

Se o resto for 0 a condição é falsa. E aí será múltiplo de n por definição. Muito ruim de ler assim. Evite esse tipo de expressão. Tem muita coisa subentendida e não é bom para ninguém. Mas está certo.

 

 

TESTE sempre o retorno de scanf() em especial quando está começando e pode simplesmente sair fora no primeiro erro...

 

note que em C pode usar OR AND e NOT como em C++ se incluir iso646.h. E é mais legível, em especial o notebook porque é difícil achar uma '!' no meio de uma expressão.

 

Nunca escreva um programa interativo se não precisa e enquanto não precisa. Teste assim por exemplo, usando aritmética e recortar e colar....

 

 

#include <iso646.h>
#include <stdio.h>

int main(void)
{
    int numero = 1;
    printf("Numero = %d\n", numero);
    do { numero++; } while ( numero % 11 and numero % 13 and numero % 17);
    printf("Primeiro multiplo: %d\n", numero);

    numero = 12;
    printf("Numero = %d\n", numero);
    do {
        numero++;
    } while (numero % 11 and numero % 13 and numero % 17);
    printf("Primeiro multiplo: %d\n", numero);

    numero = 14;
    printf("Numero = %d\n", numero);
    do {
        numero++;
    } while (numero % 11 and numero % 13 and numero % 17);
    printf("Primeiro multiplo: %d\n", numero);

    return 0;
}

 

que mostra

 

Numero = 1
Primeiro multiplo: 11
Numero = 12
Primeiro multiplo: 13
Numero = 14
Primeiro multiplo: 17

 

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!