C ++ Número perfeito. Precisa de ajuda para revisar
-
20-09-2019 - |
Pergunta
Preciso de ajuda para revisar isso. Ele continua exibindo apenas 0s como a temperatura. Obrigada.
// A program to determine whether the input number is a perfect number
// A perfect number is defined by the sum of all its positive divisors excluding itself
// 28: 1+2+3+7+14 = 28.
int perfect, limit, divisor;
cout << "Please enter a positive integer in order to define whether it is a perfect integer or not: " ;
cin >> perfect;
cout << endl;
int temp = 0;
int prevtemp = 0;
limit = 1;
divisor = 1;
while (limit < perfect)
{
if ((perfect % divisor) == 0)
{
divisor = prevtemp;
temp = prevtemp + temp;
}
limit++;
divisor++;
}
if (perfect == temp)
cout << "Your number is a perfect number!" << endl;
else
cout << "Your number is not a perfect number" << endl;
return 0;
Solução
Não tenho certeza, mas eu acho que no código:
if ((perfect % divisor) == 0)
divisor = prevtemp;
você pretendia que isso fosse prevtemp=divisor
em vez de. Isso corrige um problema óbvio, mas ainda deixa um pouco que não parece que está fazendo o que você provavelmente pretendia. Por exemplo, eu não consigo descobrir o que limit
tem como objetivo realizar - você inicializa e incrementa, mas até onde eu posso ver, você nunca usar Seu valor (bem, eu acho que você o usa, mas seu valor é sempre o mesmo que divisor
é então não sei por que você acha que precisa de ambos ou como limit
faz algum sentido como seu nome).
Editar: faria sentido ter um limit
. Em particular, os fatores sempre vêm em pares: um que é menor ou igual à raiz quadrada do número e que corresponde à primeira que é sempre maior ou igual à raiz quadrada do número. Como tal, você não precisa escanear até o próprio número que procura fatores - você pode definir a raiz quadrada do número como o limite e digitalizar apenas até esse ponto. Para cada fator que você encontra até aquele momento, o fator de correspondência será perfect/divisor
. Como você já conseguiu um exemplo de trabalho, acho que posso apenas esperar que isso não seja de casa e poste um exemplo também:
bool is_perfect(int number) {
int limit = sqrt((double)number);
int sum = 1;
for (int i=2; i<=limit; i++)
if (number % i == 0)
sum += i + number/i;
return sum == number;
}
Outras dicas
Você nunca está configurando prevtemp
a qualquer coisa que não seja 0, então adicionando -o a temp
faz nada.
Eu acredito que você quis dizer
if ((perfect % divisor) == 0)
temp += divisor; // not "divisor = prevtemp;"
A linha "temp = prevtemp + temp" também deve ser removida com esta solução; não há mais necessidade de prevtemp
variável.
Além disso, não há necessidade de manter separado limit
e divisor
variáveis, pois são sempre as mesmas. Basta remover limit
e altere a condição do loop para usar divisor
.
Além disso, como Mark Byers apontou, o loop seria mais simples de entender se você o refatorou em um for
loop em vez de um while
.
Parece que você está tornando muito complicado. Veja como você pode fazer isso:
int total = 0;
for (int i = 1; i < perfect; ++i)
{
if (perfect % i == 0)
total += i;
}
if (perfect == total)
cout << "Your number is a perfect number!" << endl;
else
cout << "Your number is not a perfect number" << endl;
Observe que o total em execução é mantido em uma variável chamada total
(Você chamou essa temperatura variável) e só é aumentada quando o número é um divisor exato.
Você nunca está atribuindo nada a prevtemp
Depois de inicializá -lo para 0
, então não há nada para adicionar temp
na linha que lê temp = prevtemp + temp
.
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int n,i=1,sum=0;
cout<<"Enter a number: ";
cin >> n;
while(i<n){
if(n%i==0)
sum=sum+i;
i++;
}
if(sum==n)
cout << i << " is a perfect number";
else
cout << i << " is not a perfect number";
system("pause");
return 0;
}