C ++ رقم مثالي. بحاجة الى بعض المساعدة في مراجعة

StackOverflow https://stackoverflow.com/questions/2450155

  •  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; 
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top