将列和行中的质数打印到文件中

时间:2018-07-03 12:24:22

标签: c++

我创建了一个查找素数的函数,我需要帮助将这些数写到具有列和行的格式正确的表中的文件中。我想我需要一些嵌套循环,但是我不知道什么是最好的实现。到目前为止,这是我的代码,希望大家能帮助我。谢谢

现在我的代码要做的是将数字2和3写入文件,然后它在空行的无限循环中进行。

文件应如下所示:

2  3  5  11  13  17  19  23

29 31 37 41 43 47 53

...

一直到最接近质数的4000

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;


bool isPrime(int);

int main()
{
    int counter = 0;
    int currentNumber = 2;
    ofstream outputFile("test.txt");

    for (int i = 2; i < 4000; i++)
    {

            for (int row = 1; row < 4000; row++)
            {
                for (int col = 1; col <= 8; col++)
                {
                    if (isPrime(i) == true)
                    {
                        outputFile << endl;
                        outputFile << setw(8);
                        outputFile << i;
                        outputFile << setw(10);

                        i++;

                    }   

                }
                outputFile << endl;
            }
    }

    system("pause");
    return 0;
}

bool isPrime(int number)
{
    for (int i = 2; i < number; i++)
    {
        if (number % i == 0)
        {
            return false;
        }
    }

    return true;
}

2 个答案:

答案 0 :(得分:0)

您是如此亲密。只需计数最多8个质数并打印新行,然后重置计数器,直到下一个8行即可。您已经在循环内以及“ for”行上复制了i ++,行和col的内容都是不必要的。 / p>

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;

bool isPrime(int number)
{
    for (int i = 2; i < number; i++)
    {
        if (number % i == 0)
        {
            return false;
        }
    }
    return true;
}

int main()
{
    int counter = 0;
    ofstream outputFile("test.txt");

    for (int i = 2; i < 4000; i++)
    {
        if (isPrime(i) == true)
        {
            outputFile << setw(8);
            outputFile << i;
            outputFile << setw(10);
            counter++;
        }
        if (counter == 8)
        {
            outputFile << endl;
            counter = 0;
        }
    }

    return 0;
}

答案 1 :(得分:0)

Richq已经为您提供了一种更好的方法来实现此目的,但让我们看一下您在代码中做错了什么(查看您的意图,但并不总是如此):

您的外循环从2到4000。然后为每个数字打印一个表格。 (因为您在表中也增加了i,但实际上并没有增加,但是我们可以忽略它。)这有点不对。您只需要一张桌子,这样外部循环就可以了。不过请保留int i = 2;

第二个循环:行从1到4000,每行打印8个质数。但是,您只希望数字小于4000。显然,4000 * 8质数会更大。您不知道需要多少行表格。行的退出条件应该改为i < 4000

第三循环:col从1到8。但是也许在最后一行,我将在第3个数字上超过4000。因此,如果i <4000是硬性限制(即使已经达到4000,也不能打印到行尾),则需要将其包括在条件(col <= 8) && (i < 4000)中。

内部有两个问题:

  • 您在每个素数之前打印新行。这就是为什么一行中只有一个2和3而不是同一行中的两个原因。
  • 仅当我是质数时,才增加i。因此,在2和3之后,您的增量为i。但是,如果您有4,那么表的其余部分将仅测试4不是素数,什么也不打印。

将换行符移出内部循环。您只需要在每一行之后执行此操作。在行内总是递增i。但是,如果您发现素数,则仅增加col。

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;


bool isPrime(int);

int main()
{
    int counter = 0;
    int currentNumber = 2;
    ofstream outputFile("test.txt");

    int i = 2;
    for (int row = 1; i < 4000; row++)
    {
        for (int col = 1; (col <= 8) && (i < 4000); i++)
        {
            if (isPrime(i) == true)
            {
                outputFile << setw(8);
                outputFile << i;
                outputFile << setw(10);
                col++;
             }   
         }
         outputFile << endl;
    }
    return 0;
}

bool isPrime(int number)
{
    for (int i = 2; i < number; i++)
    {
        if (number % i == 0)
        {
            return false;
        }
    }

    return true;
}
相关问题