ALGORITMOS E IMPLEMENTAÇÕESAjuda em exercicio de Algoritmos.

Implementação de equações dentro da computação, programação e algoritmos.

Moderador: [ Moderadores TTB ]

Avatar do usuário
Autor do Tópico
willianfalk
iniciante
Mensagens: 1
Registrado em: Seg 19 Jul, 2021 11:36
Última visita: 19-07-21
Jul 2021 19 11:52

Ajuda em exercicio de Algoritmos.

Mensagem não lida por willianfalk »

Boa tarde, fiz uma prova de algoritmos, e de jeito nenhum consegui resolver uma questão. estou extremamente frustrado. e gostaria muito de saber a resolução dela. que o professor não disponibilizou. segue exercício.


2) No século I d.C., havia, além da divisão dos números perfeitos, os números abundantes e os reduzidos: (valor: 3,0 pts)
–Perfeitos: se o número é igual à soma de seus divisores próprios;
Por exemplo, 6: 1 + 2 + 3 = 6.
–Abundantes: se o número é inferior à soma dos seus divisores exceto ele próprio;
Por exemplo, 12: 1 + 2 + 3 + 4 + 6 = 16.
–Reduzidos: se o número é superior à soma dos seus divisores exceto ele próprio; Por exemplo, 9: 1 + 3 = 4. Faça um algoritmo no qual em seu programa principal lê um valor inteiro que será o final do intervalo de busca que começa em 1.
Em procedimento específico que recebe parâmetro, imprima a lista de todos os inteiros neste intervalo, classificando-os em abundantes, reduzidos ou perfeitos. Apresente também seus divisores e somatória dos mesmos. Não utilize variável global. Exemplo: caso o usuário informe 15 como final de intervalo, seu programa deve apresentar exatamente o seguinte:
1:-- Soma:0 O numero 1 é reduzido!
2:-1-- Soma:1 O numero 2 é reduzido!
3:-1-- Soma:1 O numero 3 é reduzido! 4:-1-2-- Soma:3 O numero
4 é reduzido! 5:-1-- Soma:1 O numero
5 é reduzido! 6:-1-2-3-- Soma:6 O numero
6 é perfeito! …
12:-1-2-3-4-6-- Soma:16 O numero 12 é abundante! …
15:-1-3-5-- Soma:9 O numero 15 é reduzido!




mateusITA
2 - Nerd
Mensagens: 262
Registrado em: Sex 03 Out, 2014 18:29
Última visita: 24-07-21
Localização: Brasília
Jul 2021 24 02:15

Re: Ajuda em exercicio de Algoritmos.

Mensagem não lida por mateusITA »

Segue uma possível solução:

Código: Selecionar todos

#include <iostream>
#include <string.h>

// Enumeração das possíveis classificações de um número natural.
enum NUMBER_CLASSIFICATION {
	PERFECT_NUMBER,
	ABUNDANT_NUMBER,
	DEFICIENT_NUMBER
};

// Retorna true se 'divisor' divide 'dividend'; caso contrário, false.
bool isDivisor(int divisor, int dividend)
{
	if (dividend % divisor == 0)
		return true;

	return false;
}

// Retorna o número de divisores inteiros positivos de 'number' e um vetor com os divisores ('divisors' é um ponteiro para esse vetor).
int FindNaturalDivisors(int number, int** divisors)
{
	int numDivisors = 0;
	*divisors = nullptr;

	for (int i = 1; i <= number; i++)
	{
		if (isDivisor(i, number))
		{
			numDivisors++;

			*divisors = (int*)realloc(*divisors, numDivisors * sizeof(int));
			(*divisors)[numDivisors - 1] = i;
		}
	}

	return numDivisors;
}

// Retorna a classificação do número (perfeito, abundante ou reduzido) e a soma de seus divisores próprios ('sumOfProperDivisors' é um ponteiro para a soma).
NUMBER_CLASSIFICATION ClassifyNumber(int* divisors, int numDivisors, int* sumOfProperDivisors)
{
	int number = divisors[numDivisors - 1];
	*sumOfProperDivisors = 0;

	for (int i = 0; i < numDivisors - 1; i++)
	{
		*sumOfProperDivisors += divisors[i];
	}

	if (number == *sumOfProperDivisors)
		return PERFECT_NUMBER;
	else if (number < *sumOfProperDivisors)
		return ABUNDANT_NUMBER;

	return DEFICIENT_NUMBER;
}

// Imprime o número, os seus divisores próprios, a soma dos divisores próprios e a classificação do número.
void PrintNumberClassification(int number)
{
	int* divisors, numDivisors, sumDivisors;
	NUMBER_CLASSIFICATION classification;
	char buffer[10];

	numDivisors = FindNaturalDivisors(number, &divisors);
	classification = ClassifyNumber(divisors, numDivisors, &sumDivisors);

	if (classification == PERFECT_NUMBER)
		strcpy(buffer, "perfeito");
	else if (classification == ABUNDANT_NUMBER)
		strcpy(buffer, "abundante");
	else if (classification == DEFICIENT_NUMBER)
		strcpy(buffer, "reduzido");

	std::cout << number << ":-";

	for (int i = 0; i < numDivisors - 1; i++)
		std::cout << divisors[i] << "-";

	std::cout << "- Soma:" << sumDivisors << " O numero " << number << " é " << buffer << "!" << std::endl;
}

int main()
{
	int number;
	std::cout << "Digite um numero: ";
	std::cin >> number;

	for (int i = 1; i <= number; i++)
		PrintNumberClassification(i);

	return 0;
}
Compilado no Visual Studio 2019 e no OnlineGDB (https://www.onlinegdb.com/online_c++_compiler).

Obs: Tentar compilar o código acima usando a função 'strcpy' no VS2019 gerará Compiler Warning C4996. A partir do C11 foi introduzido o 'strcpy_s' (strcpy safety) e a Microsoft prefere que a versão mais recente seja usada:
"Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available."
(Disponível em https://docs.microsoft.com/en-us/cpp/er ... el-3-c4996)

Entretanto, é possível compilar usando 'strcpy' no VS2019 bastando definir _CRT_SECURE_NO_WARNINGS antes de incluir os cabeçalhos:

Código: Selecionar todos

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string.h>




Avatar do usuário
PeterPark
2 - Nerd
Mensagens: 141
Registrado em: Sáb 22 Set, 2018 11:40
Última visita: 08-04-23
Jul 2021 24 11:13

Re: Ajuda em exercicio de Algoritmos.

Mensagem não lida por PeterPark »

Copie e cole esse código na sua IDE para que a sintaxe seja destacada, o que facilita a sua visualização.

Código: Selecionar todos

#include<stdio.h>
 
//Declaraão da função que calcula número perfeito, abundante ou reduzido
void calcula_intervalo(int intervalo);
 
 
//Função principal
int main(){
    int intervalo;
    printf("Ola usuario, digite o tamanho do intervalo: ");
    scanf("%d", &intervalo);
    calcula_intervalo(intervalo);
    return 0;
}
 
//Definição da função que calcula número perfeito, abundante ou reduzido
void calcula_intervalo(int intervalo){
    int numero; //variável para fazer um loop de 1 até intervalo
    int divisor; //variável para fazer loop em busca de divisores
    
    for(numero=1; numero<=intervalo; numero++){ 
        int soma = 0; //cada número i recebe uma variável para sua soma.
        printf("%d:--", numero);
        for(divisor=1; divisor<numero; divisor++){ //testa todos os divisores 
            if(numero%divisor == 0)//para ser um divisor, o resto deve ser zero
            { 
                soma+=divisor; //se for divisor, incrementa soma
                printf("-%d-", divisor); //imprime na linha o divisor achado
            }
        }
        printf("--Soma:%d", soma); //imprime na linha a soma
        if(soma>numero)
            printf("    O numero %d e abundante\n", numero);//imprime na linha e pula
        if(soma<numero)
            printf("    O numero %d e reduzido\n", numero);//imprime na linha e pula
        if(soma==numero)
            printf("    O numero %d e perfeito\n", numero);//imprime na linha e pula
        //volta para o primeiro for e testa o próximo número
    }
}

Última edição: PeterPark (Sáb 24 Jul, 2021 11:15). Total de 1 vez.


Either you die as a programmer, or live long enough to become a scammer. :wink:

Responder
  • Tópicos Semelhantes
    Respostas
    Exibições
    Última msg

Voltar para “ALGORITMOS E IMPLEMENTAÇÕES”