【问题标题】:Finding Prime Numbers using For Loops in C++在 C++ 中使用 For 循环查找素数
【发布时间】:2023-12-10 18:02:02
【问题描述】:

这是我在这里的第一篇文章,所以我希望我做的一切都是正确的。

我最近的编程挑战有点问题。目标是让用户输入一个数字,并让程序输出介于 0 和输入的数字之间的所有素数。我的策略是让 for 循环对从 1 到输入的每个数字进行简单检查,方法是将其除以前面的每个数字,直到循环达到 1。如果在检查中的任何一点,程序遇到一个数字,该数字分为循环当前打开的数字,循环的那部分是“中断”并继续到下一个数字。如果除数达到 1,那么程序将成功确定没有任何东西可以均匀地除以原始数字并将该数字输出为素数。

我对编程很陌生,但我认为这是我如何使用 break 的问题。编译程序时,它只打印输入的原始数字,不打印其他内容。但是,我已经检查以确保我所有的整数和循环都在工作。关于我上述问题的任何帮助,或者我是否可以使我的代码更高效或“正确”,我们将不胜感激。

#include "stdafx.h"
#include <iostream>

int _tmain()
{
    using namespace std;
    int iUserInput;
    cin >> iUserInput;

    for(;iUserInput > 0; iUserInput--)
    {
        int iDivisor = iUserInput - 1;
        for (; iDivisor > 0; iDivisor--)
        {
            if (iUserInput%iDivisor == 0)
                break;
            if (iDivisor == 1)
                cout << iUserInput << endl;
        }
    }


    return 0;
}

【问题讨论】:

    标签: c++ for-loop break


    【解决方案1】:

    以下部分:

    if (iDivisor == 1)
        cout << iUserInput << endl;
    

    在错误的位置。你需要把它放在内循环之外

    for(;iUserInput > 0; iUserInput--)
    {
        int iDivisor = iUserInput - 1;
        for (; iDivisor > 0; iDivisor--)
        {
            if (iUserInput%iDivisor == 0)
                break;
        }
        if (iDivisor == 1)
            cout << iUserInput << endl;
    }
    

    其他观察:

    • #include "stdafx.h" 在这里完全没有必要。删除它。
    • int _tmain() 不是标准的。将其设为 int main() 并确保它像这样编译。
    • iUserInput 是匈牙利符号。认为它是 90 年代失败的微软实验,在现代 C++ 中完全没用。调用变量userInput
    • 更改userInput 变量的值可能会损害代码的可读性。毕竟,用户输入在输入后不会改变。考虑倒计时userInput 的副本,例如for(int count = userInput; count &gt; 0; count--)
    • 让您的另一个 for 循环也更紧凑:for (int divisor = userInput - 1; divisor &gt; 0; divisor--)
    • 对于刚开始学习 C++ 的人来说可能太高级了,但您应该尝试处理非法用户输入,例如有人输入“X”而不是数字。您可以在每次输入操作后检查std::cin 的状态,以查看最后一次操作是否成功。否则您的程序可能会出现未定义的行为。

    【讨论】:

      【解决方案2】:

      你打破得太快了 :) 当 iDivisor 为 1 时,iUserInput%iDivisor 必须等于 0,并且永远不会评估第二个条件。只需交换两个 if 语句,你应该会很好。

      【讨论】:

        【解决方案3】:

        查看 if 条件的执行顺序。当 iDivisor 达到 1 时,您会中断而不是打印。任何一个 1)交换你的 if 条件或 2) 修改内部循环以在 iDivisor 达到 1 时终止,如果条件超出内部 for 循环,则移动第二个。

        【讨论】: