Olá, Comunidade!

Vocês devem ter notado que o site ficou um período fora do ar (do dia 26 até o dia 30 de maio de 2024).

Consegui recuperar tudo, e ainda fiz um UPGRADE no servidor! Agora estamos em um servidor dedicado no BRASIL!
Isso vai fazer com que o acesso fique mais rápido (espero 🙏)

Já arrumei os principais bugs que aparecem em uma atualização!
Mas, se você encontrar alguma coisa diferente, que não funciona direito, me envie uma MP avisando que eu arranjo um tempo pra arrumar!

Vamos crescer essa comunidade juntos 🥰

Grande abraço a todos,
Prof. Caju

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: 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: 03 Out 2014, 18:29
Última visita: 24-07-21
Localização: Brasília
Agradeceram: 193 vezes
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: 22 Set 2018, 11:40
Última visita: 08-04-23
Agradeceu: 22 vezes
Agradeceram: 3 vezes
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
    }
}

Editado pela última vez por PeterPark em 24 Jul 2021, 11:15, em um 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 mensagem

Voltar para “ALGORITMOS E IMPLEMENTAÇÕES”