【问题标题】:Find a perfect Number from a range of numbers based on user input根据用户输入从一系列数字中找到一个完美的数字
【发布时间】:2019-05-17 07:50:56
【问题描述】:

用户输入一个数字,例如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;

}

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

【问题讨论】:

  • 您需要在外部for 循环的每次迭代中将sum 重置为零。
  • 另外,如果你输入100,它只会打印199之间的完美数字。你可能想在总和之后打印一个换行符。
  • 请注意,您可以使用for(int u=1; u &lt;= i/2; u++)加快搜索速度

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


【解决方案1】:

您需要在第二个 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 次迭代

【讨论】:

  • 注意可以限制搜索可能的除数:wandbox.org/permlink/jvUXCrxlHiRSAacC
  • @Bob__ 好话。没想到,因为我只是修改了 OP 代码,以便给出最快的答案。我正在编辑以考虑到这一点
【解决方案2】:

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

#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;

}

【讨论】:

  • 这行不通,因为测试 sum == i 不是在好地方。此外,您应该用文字解释为什么您的解决方案比 OP 的解决方案更好(注意:我没有投反对票,因为我认为您会改进您的答案)
  • 我误解了他想要什么,我认为这个数字可以是任何正除数的总和,否则他可以在循环结束后将总和休息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2020-01-24
  • 2020-10-29
  • 1970-01-01
  • 2013-08-14
  • 2019-07-27
相关资源
最近更新 更多