C ++ perfekte Zahl. Brauchen Sie Hilfe Überarbeitung
-
20-09-2019 - |
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;
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;
}