C ++ رقم مثالي. بحاجة الى بعض المساعدة في مراجعة
-
20-09-2019 - |
سؤال
أحتاج إلى بعض المساعدة في مراجعة هذا. إنه يحتفظ فقط بعرض 0s كما temp. شكرًا لك.
// 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;
المحلول
لست متأكدا، لكنني أعتقد ذلك في الرمز:
if ((perfect % divisor) == 0)
divisor = prevtemp;
كنت تقصد هذا prevtemp=divisor
في حين أن. هذا يعمل على إصلاح مشكلة واضحة، ولكن لا يزال يترك قليلا تماما لا يبدو الأمر كما تفعل ذلك ربما كنت المقصود. على سبيل المثال، لا أستطيع معرفة ما limit
يهدف إلى إنجاز - قمت بتهيئة ذلك وزيادة ذلك، ولكن بقدر ما أستطيع أن أرى، أنت أبدا استعمال قيمتها (حسنا، أعتقد أنك تستخدمها، لكن قيمتها هي نفسها دائما divisor
لذلك أنا لست متأكدا لماذا تعتقد أنك تحتاج إلى كليهما، أو كيف limit
يجعل أي معنى اسمه).
تحرير: من المنطقي أن يكون لديك limit
. وبعد على وجه الخصوص، تأتي العوامل دائما في أزواج: واحد أقل من أو يساوي الجذر التربيعي للرقم، والآخر يطابق الأول دائما أكبر من أو يساوي الجذر التربيعي للرقم. على هذا النحو، لا تحتاج إلى مسح كل الطريق حتى الرقم نفسه الذي يبحث عن عوامل - يمكنك ضبط الجذر التربيعي للرقم كحد أقصى، والمسح فقط حتى تلك النقطة. لكل عامل تجده حتى هذه النقطة، سيكون عامل المطابقة perfect/divisor
. وبعد منذ أن حصلت بالفعل على مثال عمل واحد، أعتقد أنني قد آمل أيضا أن تكون هذه ليست واجب منزلي، ونشر مثالا كذلك:
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;
}
نصائح أخرى
أنت لا تحدد أبدا prevtemp
إلى أي شيء آخر غير 0، لذلك مضيفا temp
لا يفعل شيئا.
أعتقد أنك تعني أن أقول
if ((perfect % divisor) == 0)
temp += divisor; // not "divisor = prevtemp;"
يجب أيضا إزالة الخط "Temp = Prevtemp + Temp" مع هذا الحل؛ لم تعد هناك أي حاجة ل prevtemp
عامل.
أيضا، ليست هناك حاجة للحفاظ على منفصلة limit
و divisor
المتغيرات، لأنها دائما نفس الشيء. فقط أخرج limit
وتغيير حالة حلقة لاستخدامها divisor
.
كما أشار مارك Byers، ستكون الحلقة أكثر بساطة لفهمها إذا قمت بإعادة تعويضها إلى for
حلقة بدلا من while
.
يبدو أنك تجعل الأمر معقدا للغاية. إليك كيف يمكنك القيام بذلك:
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;
لاحظ أن إجمالي تشغيله يتم الاحتفاظ به في متغير يسمى total
(تسمى Temp المتغير هذا) وزيادة فقط عندما يكون الرقم مقسمنا دقيقا.
أنت لا تعني أي شيء prevtemp
بعد تهيئة ذلك 0
, ، لذلك لا يوجد شيء للإضافة إليه temp
على الخط الذي يقرأ 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;
}