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

时间:2019-05-17 07:50:57

标签: c++ for-loop user-input

用户输入一个数字,例如100。我们需要在1到100之间找到一个理想的数字。

一个理想数是一个正整数,等于它的正除数之和,不包括数字本身。

例如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;

}

运行此代码后,它要求我输入数字,一旦输入数字,程序将退出而不打印预期结果。

2 个答案:

答案 0 :(得分:3)

您需要在第二个sum循环之前重置for。如果您不这样做,那么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次迭代

答案 1 :(得分:-1)

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

JSON.parse