根据用户输入从一系列数字中找到一个完美的数字

Find a perfect Number from a range of numbers based on user input

本文关键字:数字 完美 一个 用户 输入 一系列      更新时间:2023-10-16

用户输入一个数字。

一个完美的数字是一个正整数,等于其正数本身的正分数之和。

例如6是一个完美的数字,因为6是(1、2和3(的总和,它是6。

#include <iostream>
using namespace std;
int main() {
int input;
int sum=0;
cout << "t Find perfect Numbers" << endl;
cout << "-------------------------------- n";
cout << "Enter an upper bound Number: ";
cin >> input;
for (int i=1; i<input; i++)
{
    for(int u=1; u<i; u++)
    {
        if (i%u == 0)
        {
            sum += u;
        }
    }
    if (sum == i)
    {
        cout << sum;
    }
}
return 0;

}

运行此代码后,它要求我输入一个数字,一旦输入一个数字,程序就会退出而无需打印预期的结果。

您需要在第二个for循环之前重置sum。如果您不这样做,那么sum将不断增加范围。

这意味着例如,在检查情况i == 6之前,sum的值在输入第二个循环之前等于6。然后,您将在此结束时获得sum == 12,然后您的测试失败。

因此,在您的第一个循环的开始(或末尾(时,请将sum重置为1:

for (int i=1; i<input; i++){
   sum = 1; // <-- Don't forget this line !
   for(int u=2; u < i/u ; u++) // Only going to square root and add u + i/u if i%u == 0
   {
      if (i%u == 0)
      {
         sum += u + i/u; // If i is divisable by u, it is divisable by i/u
      }
   }
   if (sum == i)
   {
      std::cout << sum << std::endl;
   }
}

bob__指出,转到sqrt(i(并一次添加u和i/u是足够的,并且大大减少了执行时间。

编辑:重置为1允许避免1循环的迭代

这将使您在用户范围内为您提供完美的数字

#include <iostream>
using namespace std;
int main()
{
int input;
int sum=0;
cout << "t Find perfect Numbers" << endl;
cout << "-------------------------------- n";
cout << "Enter an upper bound Number: ";
cin >> input;
for (int i=1; i<input; i++)
{
for(int u=1; u<i; u++)
{
    if (i%u == 0)
    {
        sum += u;
    }
}
if (sum == i){
          cout << "n the perfect number is " <<sum;
        } 
sum = 0;
}
return 0;
}