Ir ao conteúdo

Posts recomendados

Postado

Faça um programa que calcule o Mínimo Múltiplo Comum (MMC) de 3 números inteiros. A Figura 24
apresenta um exemplo de cálculo de MMC.
 

image.png.57da7324a61f944821423874561f1b13.png

 

Entrada
O programa deve ler 3 números inteirios diferentes de zero.

 

Saída

A saída é composta por várias linhas. O programa deve replicar a saída do procedimento da Figura
24 com expresso nos exemplos de entrada e saída. Cada linha deve ser impressa com o seguinte código:
"%d %d %d :%d", onde o número 5 indica a quantidade mínima de espaços ou dígitos do número a ser
apresentado.

 

Exemplo
 

Entrada

10 5 6

 

Saída

10 5 6 :2
5 5 3 :3
5 5 1 :5
MMC: 30

 

Entrada

3 5 7

 

Saída

3 5 7 :3
1 5 7 :5
1 1 7 :7
MMC: 105

 

 

#include <stdio.h>

 

int main(){

    int a, b, c, mmc, i;

 

    scanf("%d %d %d", &a, &b, &c);

    i = 2;

    mmc = 1;

    if(a == 0 || b == 0 || c == 0){

        return 0;

    }

 

    while (a+b+c != 2)

    {

        if (a % i ==0 || b % i ==0)

        {

            mmc += i;

            if (a% i ==0)

            {

                a /=i;

            }

            if (b% i ==0)

            {

                b /=i;

            }

            if (c%i == 0)

            {

                c /= i;

            }

            

        }

        else

        {

            c += 1;

        }

        

    }

    printf("MMC= %d", mmc);

}

  • Amei 1
Postado
2 horas atrás, Eduardo_Braz disse:

Cada linha deve ser impressa com o seguinte código:
"%d %d %d :%d", onde o número 5 indica a quantidade mínima de espaços ou dígitos do número a ser
apresentado

 

Esse número 5 resolve mesmo. Só que não entendi

Postado
34 minutos atrás, Eduardo_Braz disse:

@arfneto Também não conseguir entender isso

 

Mas nem é importante. Basta uma função que retorne o próximo primo e um loop até retornar 1 1 1, replicando o enunciado

Postado

Olá!

Eu escrevi isso e uma outra rotina que usava o crivo de eratóstenes --- que a gente aprende no ensino fundamental --- e usei um método para conferir o outro e calcular os primos até um certo número. Um milhão eu acho 

 

  • Amei 1
Postado

Se você tem lá naquele programa uma função

int                retorna_um_se_primo(unsigned int n);

e ela funciona, então essa outra aqui

unsigned int    proximo_primo(unsigned int n)
{
    static int     iniciado = 0;
    static int     proximo = 0;

    if (n == 0)                        // inicia a serie
    {
        iniciado = 1;
        proximo = 2;
        return 1;
    }    // end if

    if(iniciado == 0) return 0;        // erro: tem que chamar com 0 antes

    if (proximo == 2)
    {
        proximo = 1;
        return 2;
    }    // end if

    // normal: a a partir daqui retorna o proximo primo
    for (int i = proximo+2;;i += 2)
        if (retorna_um_se_primo(i))
        {
            proximo = i;
            return proximo;
        }    // end if
}    // end proximo_primo()

Chama retorna_um_se_primo()  retorna a cada vez o próximo primo pra você usar direto na solução do seu programa... Bem conveniente.

 

Esse código por exemplo

    int        total_de_primos = 8;
    printf("proximo_primo(0) retornou %d\n", proximo_primo(0));
    for (int i = 0; i < total_de_primos; i++)
    {
        printf("proximo_primo(1) retornou %d\n", proximo_primo(1));
    }

Mostra

proximo_primo(0) retornou 1
proximo_primo(1) retornou 2
proximo_primo(1) retornou 3
proximo_primo(1) retornou 5
proximo_primo(1) retornou 7
proximo_primo(1) retornou 11
proximo_primo(1) retornou 13
proximo_primo(1) retornou 17
proximo_primo(1) retornou 19

A ideia é simples: você chama ela com 0 para iniciar a sequência e a partir daí ela vai retornando os primos um a um. Nada mais. Basta chamar com qualquer coisa diferente de zero.

 

A partir daí fica fácil calcular o mmc porque só precisa de um loop

Postado

Essa é uma possibilidade para a primeira função

int                retorna_um_se_primo(unsigned int n)
{
    if (n < 2)        return 0;
    if (n == 2)        return(1);
    if (n % 2 == 0) return(0);
    unsigned int maior = (unsigned int)sqrt((double)n);
    unsigned int fator = 3;
    while (fator <= maior)
    {
        if (n % fator == 0) return 0;
        fator += 2;
    }    // end while
    return 1;
}    // end retorna_zero_se_primo()

E essa funciona então a segunda pode ser

unsigned int    proximo_primo(unsigned int n)
{
    static int     iniciado = 0;
    static int     proximo = 0;

    if (n == 0)                        // inicia a serie
    {
        iniciado = 1;
        proximo = 2;
        return 1;
    }    // end if

    if(iniciado == 0) return 0;        // erro: tem que chamar com 0 antes

    if (proximo == 2)
    {
        proximo = 1;
        return 2;
    }    // end if

    // normal: a a partir daqui retorna o proximo primo
    for (int i = proximo+2;;i += 2)
        if (retorna_um_se_primo(i))
        {
            proximo = i;
            return proximo;
        }    // end if
}    // end proximo_primo()

E também funciona

 

Teve sucesso com o código?

Postado

 

Boa Tarde.

 

 

Em 04/11/2019 às 15:12, Eduardo_Braz disse:

Também não conseguir entender isso

Acredito que o erro fica antes da mensagem, na LARGURA de formatação (%[LARGURA]d); onde de fato podemos determinar o número mínimo de espaços ou dígitos antes ou depois de qualquer inteiro ser impresso.

 

"%5d %5d %5d :%5d

Em 03/11/2019 às 14:31, Eduardo_Braz disse:

onde o número 5 indica a quantidade mínima de espaços ou dígitos do número a ser
apresentado.

 

Faz sentido agora @Eduardo_Braz ? Então não notei os espaços extras no exemplo de saída. Talvez o examinador trocou as ideia no último estante e restou apenas essa parte para deletar.

 

Boa Sorte.

 

  • Amei 1
Postado

E se

unsigned int    proximo_primo(unsigned int);
int             retorna_um_se_primo(unsigned int);

Funcionam então se pode escrever 

unsigned int    calcula_mmc(int a, int b, int c);

Simplesmente replicando o que se faria numa folha de papel, porque proximo_primo() a cada vez que é chamada retorna o próximo primo e é o que falta pra por lá do lado direito do gabarito. E calcula_mmc()  poderia retornar algo bem parecido com o que se faz no papel, ou no enunciado

    calcula_mmc(4, 6, 8);
    calcula_mmc(10, 5, 6);
    calcula_mmc(3, 5, 7);

Mostrando

    4;     6;     8 |     2
    2;     3;     4 |     2
    1;     3;     2 |     2
    1;     3;     1 |     3
    1;     1;     1 |
--------------------|-------
                    | mmc(4;6;8) = 1x2x2x2x3 = 24


   10;     5;     6 |     2
    5;     5;     3 |     3
    5;     5;     1 |     5
    1;     1;     1 |
--------------------|-------
                    | mmc(10;5;6) = 1x2x3x5 = 30


    3;     5;     7 |     3
    1;     5;     7 |     5
    1;     1;     7 |     7
    1;     1;     1 |
--------------------|-------
                    | mmc(3;5;7) = 1x3x5x7 = 105

:) 

Eis um código possível, com comentários e menos de 30 linhas:

unsigned int    calcula_mmc(int a, int b, int c)
{
    char       produtos[256];                  // para montar o resultado
    int        mmc = 1;                        // o proprio MMC
    int        n;
    int        primo = proximo_primo(0);       // inicia o gerador
    sprintf(produtos," mmc(%d;%d;%d) = 1", a, b, c);
    primo = proximo_primo(1);                  // pega o 2
    printf("\n\n%5d; %5d; %5d |", a, b, c);    // comeca o esquema
    do
    {
        n = 0;
        if (a % primo == 0)    n += 1,    a = a / primo;            // a = multiplo
        if (b % primo == 0)    n += 1,    b = b / primo;            // b = multiplo
        if (c % primo == 0)    n += 1,    c = c / primo;            // c = multiplo
        if (n == 0)
            primo = proximo_primo(1);        // nem a nem b nem c e multiplo desse
        else
        {
            sprintf(produtos, "%sx%u", produtos, primo);    // acrescenta fator ou vai perder
            printf(" %5d\n%5d; %5d; %5d |", primo, a, b, c);    // nova linha
            mmc = mmc * primo;                // atualiza MMC
        }    // end if
        if (a > 1 || b > 1 || c > 1) continue;    // ainda tem ao menos 1
        break;
    } while (1);                                // vai sair apenas com 1;1;1
    printf("\n--------------------|-------\n                    |%s = %d\n", produtos, mmc);
    return mmc;
}    // end calcula_mmc()

 

Postado

@arfneto Não conseguir arrumar :(

adicionado 25 minutos depois

@arfneto @Mauro Britivaldo Não sei onde colocar a função no código.

 

#include <stdio.h>

 

int main(){

    int a, b, c, mmc, i;

 

    scanf("%d %d %d", &a, &b, &c);

    i = 2;

    mmc = 1;

    if(a == 0 || b == 0 || c == 0){

        return 0;

    }

 

    while (a+b+c != 2)

    {

        if (a % i ==0 || b % i ==0)

        {

            mmc += i;

            if (a% i ==0)

            {

                a /=i;

            }

            if (b% i ==0)

            {

                b /=i;

            }

            if (c%i == 0)

            {

                c /= i;

            }

            

        }

        else

        {

            c += 1;

        }

        

    }

    printf("MMC= %d", mmc);

}

Postado

@Eduardo_Braz o colega de fórum só exemplificou, foque mais em suas ideias e menos é adaptar suas soluções.

 

Note que as bases do problema é decomposição do trio de números em fatores primos.

 

A chave é encontrar os números primos que determinam a, b, c até degenera-los em 1.

 

Implemente você uma nova ideia. Por exemplo: o colega exemplificou que nem todo número ímpar é primo, mas todo primo diferente de 2 é ímpar. Logo posso "degenera-los" em "fatores ímpares"? Ou seja, ao invés de uma função para o menor denominador primo terei uma variável que incremento +2 a partir de 3 logo depois que os valores forem todos ímpares também.

 

Ops! Parece-me que você meio que chegou a essa conclusão também, aí olhei seu código vejo o i em incremento +1 somente se ninguém anteriormente for divisível por i. Pensa mais um pouco, acho que é por aí mesmo. O MMC é o PRODUTO de fatores.

 

 

Aguardando ...

Postado

Quase sempre ajuda você mesmo resolver, assim como um estudante faz do ensino médio. Papel e lápis. Preste atenção nas etapas.

 

11 minutos atrás, Eduardo_Braz disse:

@Mauro Britivaldo Muito obrigado vou tentar aqui para ver se eu consigo

Aguardando ...

Postado
5 horas atrás, Eduardo_Braz disse:

@arfneto Não conseguir arrumar :(

adicionado 25 minutos depois

@arfneto @Mauro Britivaldo Não sei onde colocar a função no código.


#

include <stdio.h>

 

int main(){

    int a, b, c, mmc, i;

 

    scanf("%d %d %d", &a, &b, &c);

    i = 2;

    mmc = 1;

    if(a == 0 || b == 0 || c == 0){

        return 0;

    }

 

    while (a+b+c != 2)

    {

        if (a % i ==0 || b % i ==0)

        {

            mmc += i;

            if (a% i ==0)

            {

                a /=i;

            }

            if (b% i ==0)

            {

                b /=i;

            }

            if (c%i == 0)

            {

                c /= i;

            }

            

        }

        else

        {

            c += 1;

        }

        

    }

    printf("MMC= %d", mmc);

}

 

Não entendi de fato seu programa ainda. Não entendi o que é o

 while (a+b+c != 2){} 

por exemplo. O que pretende com esse loop? E os primos?

 

Nesse problema a ideia é replicar o que está feito naquele desenho, o que aprendemos no ensino fundamental para calcular o MMC. Igualzinho está lá. Eu te mostrei uma saída para os 3 casos do enunciado por exemplo para 10,5,6

 

Isso é o resultado da execução daquela função entende? calcula_mmc(10,5,6)

   10;     5;     6 |     2
    5;     5;     3 |     3
    5;     5;     1 |     5
    1;     1;     1 |
--------------------|-------
                    | mmc(10;5;6) = 1x2x3x5 = 30

O exercício aqui não se trata simplesmente de calcular o MMC, porque aí podíamos usar qualquer método, por exemplo multiplicar a*b*c que seria naturalmente um múltiplo comum. E ir simplificando até ele ficar mínimo, o que pode dar na mesma se eles forem primos entre si como mmc(3,5,7) por exemplo. Acho que seria o mais comum a se fazer.

 

Aqui é para replicar aquele método do papel e lápis da escola fundamental.

 

Você deve pensar mais a respeito e criar algo parecido. Eu fiz uns no papel antes de escrever o programa e deu certo.

 

Sobre onde colocar a função, vou te mostrar algo. Vou incluir as funções no seu programa e chamar as funções e aí ele vai mostrar o resultado de que precisa e vai te dar uma luz imagino.

#include "math.h"
#include "stdio.h"

int				retorna_um_se_primo(unsigned int n)
{
	if (n < 2)		return 0;
	if (n == 2)		return(1);
	if (n % 2 == 0) return(0);
	unsigned int maior = (unsigned int)sqrt((double)n);
	unsigned int fator = 3;
	while (fator <= maior)
	{
		if (n % fator == 0) return 0;
		fator += 2;
	}	// end while
	return 1;
}	// end retorna_zero_se_primo()

unsigned int	proximo_primo(unsigned int n)
{
	static int	 iniciado = 0;
	static int	 proximo = 0;

	if (n == 0)						// inicia a serie
	{
		iniciado = 1;
		proximo = 2;
		return 1;
	}	// end if

	if (iniciado == 0) return 0; // erro: tem que chamar com 0 antes

	if (proximo == 2)
	{
		proximo = 1;
		return 2;
	}	// end if

	// normal: a a partir daqui retorna o proximo primo
	for (int i = proximo + 2;; i += 2)
		if (retorna_um_se_primo(i))
		{
			proximo = i;
			return proximo;
		}	// end if
}	// end proximo_primo()


unsigned int	calcula_mmc(int a, int b, int c)
{
	char	produtos[256];					// para montar o resultado
	int		mmc = 1;						// o proprio MMC
	int		n;
	int		primo = proximo_primo(0);		// inicia o gerador
	sprintf(produtos, " mmc(%d;%d;%d) = 1", a, b, c);
	primo = proximo_primo(1);				// pega o 2
	printf("\n\n%5d; %5d; %5d |", a, b, c);	// comeca o esquema
	do
	{
		n = 0;
		if (a % primo == 0)	n += 1, a = a / primo;			// a = multiplo
		if (b % primo == 0)	n += 1, b = b / primo;			// b = multiplo
		if (c % primo == 0)	n += 1, c = c / primo;			// c = multiplo
		if (n == 0)
			primo = proximo_primo(1);// nem a nem b nem c e multiplo desse
		else
		{
			sprintf(produtos, "%sx%u", produtos, primo);
          // acrescenta fator ou vai perder
			printf(" %5d\n%5d; %5d; %5d |", primo, a, b, c);// nova linha
			mmc = mmc * primo;				// atualiza MMC
		}	// end if
		if (a > 1 || b > 1 || c > 1) continue;	// ainda tem ao menos 1
		break;
	} while (1);			// vai sair apenas com 1;1;1
	printf(
      "\n--------------------|-------\n                    |%s = %d\n",
      produtos, mmc);
	return mmc;
}	// end calcula_mmc()



int main()
{
	int a, b, c, mmc, i;

	i = 2;
	calcula_mmc(10, 5, 6);
	if (i == 2) return 0;

	scanf("%d %d %d", &a, &b, &c);

	mmc = 1;

	if (a == 0 || b == 0 || c == 0)
	{
		return 0;
	}

	while (a + b + c != 2)
	{
		if (a % i == 0 || b % i == 0)
		{
			mmc += i;
			if (a % i == 0)
			{
				a /= i;
			}
			if (b % i == 0)
			{
				b /= i;
			}
			if (c % i == 0)
			{
				c /= i;
			}
		}
		else
		{
			c += 1;
		}
	}	// while()
	printf("MMC= %d", mmc);
}

Esse é o seu programa com as funções que te mostrei coladas no início.

    i = 2;
    calcula_mmc(10, 5, 6);
    if (i == 2) return 0;

Eu só incluí as 3 funções que te mostrei. Logo no início assim você vai ter um programa completo para servir de base. E essas 3 linhas aí em cima chamam a função que eu escrevi e vão te dar uma ideia de uma maneira de resolver o problema. Eu já tinha postado isso mesmo. Achei que já teria talvez escrito isso. 

 

Ao escrever a sua solução tire essa linha que chama calcula_mmc() e pronto. Claro, apague as funções que inseri. Vou deixar uma cópia do programa anexa. Rode esse programa

TextFile2.txt

Postado
9 horas atrás, arfneto disse:

Não entendi de fato seu programa ainda. Não entendi o que é o


 while (a+b+c != 2){} 

por exemplo. O que pretende com esse loop? E os primos?

 

 

Numa situação ideal a soma dos termos fatorados é diferente de 3 somente se há termo decomponível, então se há devemos continuar em loop.

Op7iOycmrysGSlPuzDBbHGvzX3IPwv-Jif7j7FIzCorreto!

 

 

Acredito que não tem nada a ver com somente os primos e sim com tudo. É loop do cálculo propriamente dito.

Postado
9 horas atrás, Mauro Britivaldo disse:

Numa situação ideal a soma dos termos fatorados é diferente de 3 somente se há termo decomponível, então se há devemos continuar em loop.

Op7iOycmrysGSlPuzDBbHGvzX3IPwv-Jif7j7FIzCorreto!

 

Ah tá!  E onde entra a soma dos 3 parâmetros ser diferente de 2? 

while (a+b+!= 2){}

E não há qualquer referência aos números primos pra colocar no formulário...

Não entendo mesmo. E o valor de i nunca é incrementado, mas sim o de c que é um dos parâmetros e cuja soma deve ser diferente de 2 para encerrar o tal loop...

Postado

 

Ainda sim a lógica está correta.

 

3 horas atrás, arfneto disse:

a+b+!= 2

 

Notei que é  se a, b, c não são decomponivéis é porque chegaram no 1. Logo a soma é 3 e o loop termina

  • Curtir 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!