在C ++中使用For循环查找素数

时间:2015-03-11 20:45:17

标签: c++ for-loop break

这是我在这里发表的第一篇文章,所以我希望我能正确地完成所有工作。

我最近的编程挑战有点问题。目标是让用户输入一个数字,并让程序输出介于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;
}

3 个答案:

答案 0 :(得分:2)

以下部分:

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 > 0; count--)
  • 使您的其他for循环更加紧凑:for (int divisor = userInput - 1; divisor > 0; divisor--)
  • 对于刚刚开始学习C ++的人来说,也许太先进了,但是你应该尝试处理非法的用户输入,例如:有人输入“X”而不是数字。您可以在每次输入操作后检查std::cin的状态,以查看上一次操作是否成功。否则,您的程序可能会出现未定义的行为。

答案 1 :(得分:0)

你太快了:)当iDivisor为1时,iUserInput%iDivisor必须等于零,并且第二个条件永远不会被评估。只需交换两个if语句就可以了。

答案 2 :(得分:0)

查看if条件执行的顺序。当iDivisor达到1时,你会打破而不是打印。或 1)交换你的if条件或 2)修改内部循环以在iDivisor达到1时终止,如果条件在内部循环之后移动第二个循环。