【问题标题】:C++ Perfect Number With Nested Loops Issue带有嵌套循环问题的 C++ 完美数
【发布时间】:2012-10-11 05:50:09
【问题描述】:

我想做的是寻找一个完美的数字。 完美数是其所有除数之和,例如 6 = 1+2+3。

基本上我在这里做的是要求 2 个数字并在这两个数字之间找到一个完美的数字。我有一个测试可分性和 2 个嵌套循环的函数。

我的问题是我没有得到任何结果。我已经对其进行了修改,似乎找不到任何问题。编译器不会抛出任何错误。

有什么问题?

#include <iostream>
using namespace std;

bool isAFactor(int, int);

int main()
{

int startval;
int endval;
int outer_loop;
int inner_loop;
int perfect_number = 0;

cout << "Enter Starting Number: ";
cin >> startval;
cout << "Enter Ending Number: ";
cin >> endval;

for(outer_loop = startval; outer_loop <= endval; outer_loop++)
{
    for(inner_loop = 1; inner_loop <= outer_loop; inner_loop++)
    {
        if (isAFactor(outer_loop, inner_loop) == true)
        {
            inner_loop += perfect_number;
        }
    }

if (perfect_number == outer_loop)
{
    cout << perfect_number << " is a perfect number." << endl;
}

else
{
    cout << "There is no perfect number." << endl;
}

}

system("PAUSE");
return 0;
}

bool isAFactor(int outer, int inner)
{
if (outer % inner == 0)
{
    return true;
}

else
{
    return false;
}

【问题讨论】:

  • 您是否尝试过使用调试器
  • 您正在将字符串读入 int 值。那是行不通的。您必须读入一个字符数组,并将第一个字符转换为整数。
  • @SethBattin:试试提问者的代码,你会发现那部分没问题。

标签: c++ loops nested boolean perfect-numbers


【解决方案1】:

inner_loop += perfect_number; 应该是perfect_number += inner_loop;

还有其他问题——您需要在每个外循环中将perfect_number 重置为零,如果范围内的数字都不完美,您应该打印消息"There is no perfect number.",而不是每次打印一次范围内的数字不完美。

我建议您将 perfect_number 重命名为 sum_of_factorsouter_loop 重命名为 candidate_perfect_numberinner_loop 重命名为 candidate_factor 或类似名称。

【讨论】:

  • 另外,perfect_number 每次通过外循环都需要重置。
【解决方案2】:

if 语句之后:

cout << perfect_number;
cout << outer_loop;

if (perfect_number == outer_loop)
{
    cout << perfect_number << " is a perfect number." << endl;
}

看看他们有什么价值观

更新:

你的 endval 值是多少?是 0?,这就是为什么循环这么早就结束了

【讨论】:

    【解决方案3】:

    哦,问题太多了。

    1. 变量perfect_number 永远不会改变。你的编译器标志了吗 这个?
    2. 外部循环退出时会比结束值大一; 你知道吗?
    3. 您无需将 bool 值与 truefalse 进行比较。
    4. 您可以将isAFactor 函数简化为return (outer % inner) == 0;
    5. 您可以用表达式替换对isAFactor 的调用 ((outer % inner) == 0)

    【讨论】:

    • (1) 是一个错误,(2) 很好(至少,如果 endval != INT_MAX,这是一个讨厌的极端情况),(3) 和 (4) 是冗余代码,应该是清理但不要停止程序工作,(5)从哲学上讲,您是否觉得子例程是一件好事 :-) 实际上我认为这段代码可以受益于 more不同的功能,而不是更少。
    • 顺便说一句,我需要什么编译器选项来获得perfect_number 未被修改的警告?这是一个相当繁琐的编译器,要唠叨你标记它const。为什么在main 中警告perfect_number 而不是在isAFactor 中警告outer 是非常量但从未修改过?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2023-04-01
    • 2016-06-06
    • 1970-01-01
    • 2022-11-21
    • 2021-05-17
    相关资源
    最近更新 更多