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;
Foi útil?

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; 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top