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!
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
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ÇÕES ⇒ Ajuda em exercicio de Algoritmos.
Moderador: [ Moderadores TTB ]
-
- Mensagens: 1
- Registrado em: 19 Jul 2021, 11:36
- Última visita: 19-07-21
-
- 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.
Segue uma possível solução:
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:
Entretanto, é possível compilar usando 'strcpy' no VS2019 bastando definir _CRT_SECURE_NO_WARNINGS antes de incluir os cabeçalhos:
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;
}
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:
(Disponível em https://docs.microsoft.com/en-us/cpp/er ... el-3-c4996)"Microsoft deprecated some CRT and C++ Standard Library functions and globals because more secure versions are available."
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>
-
- 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.
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.
-
- Tópicos Semelhantes
- Respostas
- Exibições
- Última mensagem