Pregunta

Necesito un poco de ayuda en la corrección. Sólo se permite seguir mostrando 0s como la temperatura. Gracias.

// 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;
¿Fue útil?

Solución

No estoy seguro, pero supongo que en el código:

if ((perfect % divisor) == 0)
    divisor = prevtemp;

usted pensó que esto se prevtemp=divisor lugar. Se soluciona un problema obvio, pero aún deja un poco que no parezca que está haciendo que probablemente pretendía. Por ejemplo, yo no puedo averiguar qué limit pretende lograr - inicializar y se incrementará, pero por lo que puedo ver, nunca usar su valor (bueno, supongo que lo utilice, pero su valor es siempre el mismo que el de divisor así que no estoy seguro de por qué cree que necesita ambos, o cómo limit tiene sentido como su nombre).

Edit: No tendría sentido tener un limit. En particular, los factores siempre vienen en pares: uno que es menor o igual a la raíz cuadrada del número, y uno que coincide con la primera que es siempre mayor o igual a la raíz cuadrada del número. Como tal, no es necesario para escanear todo el camino hasta el número en sí en busca de factores - se puede establecer la raíz cuadrada del número como el límite, y escanear sólo hasta ese punto. Para cada factor a encontrar hasta ese momento, se perfect/divisor el factor correspondiente. Puesto que ya ha conseguido un ejemplo de trabajo, supongo que bien podría simplemente espero que esto no es tarea, y publicar un ejemplo, así:

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;
}

Otros consejos

Usted nunca configurando prevtemp a otra cosa que no sea 0, por lo que añadir a temp no hace nada.

Creo que quería decir

if ((perfect % divisor) == 0) 
    temp += divisor; // not "divisor = prevtemp;"

La línea "temp = prevtemp + temp" debe también ser eliminado con esta solución; ya no hay ninguna necesidad de que la variable prevtemp.

Además, no hay necesidad de mantener las variables limit y divisor separados, ya que son siempre los mismos. Basta con retirar limit y cambiar la condición de bucle de usar divisor.

Además, como Mark Byers señaló, el bucle sería más fácil de entender si se refactorizado en un bucle en lugar de un for while.

Parece que usted está haciendo que sea demasiado complicado. He aquí cómo usted puede hacerlo:

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;

Tenga en cuenta que el total acumulado se mantiene en una variable llamada total (que llamó esta variable temp) y sólo se incrementa cuando el número es un divisor exacto.

Usted nunca nada asignando a prevtemp después de inicializar a 0, así que no hay nada que añadir a temp en la línea que dice 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top