Frage

Ich brauche Hilfe diese zu revidieren. Es hält 0s als temp nur angezeigt werden. Danke.

// 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;
War es hilfreich?

Lösung

Ich bin nicht sicher, aber ich würde das erraten im Code:

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

Sie soll diese prevtemp=divisor stattdessen sein. Das behebt ein offensichtliches Problem, lässt aber immer noch ziemlich viel, das sieht nicht wie es tut, dass Sie wahrscheinlich gedacht. Zum Beispiel kann ich nicht ganz herausfinden, was limit erreichen soll - Sie initialisieren und erhöhen es, aber soweit ich sehen kann, man kann nie Verwendung seinen Wert (na ja, ich denke, Sie verwenden, aber sein Wert ist immer gleich divisor ist so ich bin nicht sicher, warum Sie denken, Sie brauchen beide, oder wie limit macht keinen Sinn, wie der Name).

Edit: Es wäre sinnvoll, einen limit zu haben. Insbesondere kommen Faktoren immer paarweise: eine, die weniger ist als oder gleich der Quadratwurzel der Zahl, und eine, die die erste übereinstimmt, als immer größer ist oder gleich der Quadratwurzel der Zahl. Als solche müssen Sie nicht den ganzen Weg bis zu der Anzahl sich nach Faktoren suchen scannen - Sie die Quadratwurzel der Zahl als Grenze gesetzt, und bis zu diesem Zeitpunkt nur bis scannen. Für jeden Faktor, den Sie zu diesem Punkt finden, wird der Anpassungsfaktor perfect/divisor sein. Da Sie bereits ein funktionierendes Beispiel bekommen haben, ich denke, könnte ich auch nur hoffen, dass dies nicht Hausaufgaben, und poste ein Beispiel auch:

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

Andere Tipps

Sie sind nie prevtemp auf etwas anderes als 0 gesetzt wird, so dass es zu temp Zugabe nichts tut.

Ich glaube, Sie dazu sagen

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

Die Zeile „temp = prevtemp + temp“ sollte auch mit dieser Lösung entfernt werden; dort nicht mehr die Notwendigkeit, dass die prevtemp Variable.

Auch gibt es keine Notwendigkeit, separaten limit und divisor Variablen zu halten, da sie immer gleich ist. Nur limit entfernen und die Schleifenbedingung zu verwenden divisor ändern.

Auch als Mark Byers wies darauf hin, würde die Schleife einfacher zu verstehen, wenn man sich in eine for Schleife Refactoring statt einem while.

Es scheint, wie Sie es zu kompliziert machen. Hier ist, wie Sie es tun könnte:

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;

Beachten Sie, dass die laufende Summe in einer Variablen namens total gehalten wird (man nennt diese Variable temp), und es wird nur dann erhöht, wenn die Zahl eine exakte Divisor ist.

Sie werden nie etwas prevtemp zuweisen, nachdem es zu 0 Initialisierung, so gibt es nichts zu temp auf der Linie hinzuzufügen, die temp = prevtemp + temp liest.

#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; 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top