如何限制连续的数字数量?

时间:2019-03-14 23:06:06

标签: c++ primes

我试图列出一组素数,从下限到上限将行中的素数的数量限制为8。尽管已经完成了第一部分,但我无法列出它们每行只有8个质数的行。

#include <iostream>
enter code here

int main()
{
    int low, high, i, flag, j;
    cout << "Enter two numbers(intervals): ";
    cin >> low >> high;
    cout << "Prime numbers between " << low << " and " << high << " are: ";
    while (low < high)
    {
        flag = 0;
        for (i = 2, j = 1; i <=low/2; +ii, ++j)
        {
            if (j == 8)
            {
                cout << "\n";
                j = j - 7;
            }
            else if (low % i == 0)
                {
                    flag = 1;
                    break;
                }
            }
        if (flag == 0)
            cout << low << " ";
            ++low;
    }
return 0;
}

它适用于第一行,然后其他所有内容似乎开始列出而不是连续显示。

Output: Enter two numbers(intervals): 1
200
Prime numbers between 1 and 200 are: 1 2 3 5 7 11 13 17
19
23
29
31 ...

2 个答案:

答案 0 :(得分:0)

您的代码不是每8个质数除一次,而是在搜索质数期间每8个除数的尝试。因此,任何与上一个值相差8个或更多值的质数都会产生换行符。考虑以下解决方法:

#include <iostream>
using namespace std;

int main()
{
    int low, high, i, flag, j;
    cout << "Enter two numbers(intervals): ";
    cin >> low >> high;
    cout << "Prime numbers between " << low << " and " << high << " are: ";
    j = 0;
    while (low < high)
    {
        flag = 0;
        for (i = 2; i <=low/2; ++i)
        {
            // Removed here
            if (low % i == 0)
            {
                flag = 1;
                break;
            }
        }
        if (flag == 0)
        {
            ++j; // Added here
            cout << low << " ";
        }
        if (j == 8) // and here
        {
            cout << "\n";
            j = j - 8;
        }
        ++low;
    }
    return 0;
}

顺便说一句,当到达low而不是low / 2的平方根时,应该结束搜索。循环会更快。

答案 1 :(得分:0)

已经有点晚了,但我说我愿意。我的建议:

#include <iostream>
//enter code here
using std::cin;
using std::cout;

int main()
{
    int low, high, count, i;
    bool flag; // bools are more suited to being flags
    cout << "Enter two numbers(intervals): ";
    cin >> low >> high;
    cout << "Prime numbers between " << low << " and " << high << " are: ";
    count = 1; // I replaced j with this for ease of reading
    while (low < high)
    {

        flag = true;
        // using break in loops is not recommended, and you already have a flag
        for (i = 2; i <= low / 2 && flag; ++i)
        {
            if (low % i == 0)
            {
                flag = false;
            }
        }
        if (flag)
        {
            cout << low;
            if (count == 8)
            {
                cout << std::endl;
                count = 1;
            }
            else
            {
                cout << " ";
                ++count;
            }
        }
        ++low;
    }
    return 0;
}