C++ 将列和行中的素数打印到文件中

C++ 将列和行中的素数打印到文件中,c++,C++,我创建了一个查找素数的函数,我需要帮助将这些数字写入一个格式良好的表(包含列和行)中的文件。我想我需要一些嵌套循环,但我不知道什么是最好的实现。这是我到目前为止的代码,希望你们能帮助我。谢谢 现在,我的代码所做的是将数字2和3写入文件,然后它进入一个由空行组成的无限循环 该文件应如下所示: 2 3 5 11 13 17 19 23 29 31 37 41 43 47 53 ... 一直到最接近4000的素数 #include <iostream> #inc

我创建了一个查找素数的函数,我需要帮助将这些数字写入一个格式良好的表(包含列和行)中的文件。我想我需要一些嵌套循环,但我不知道什么是最好的实现。这是我到目前为止的代码,希望你们能帮助我。谢谢

现在,我的代码所做的是将数字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;
}

你太接近了。只需数到8个素数并打印出新行,然后重置计数器直到下一个8。您已经在循环中以及for行中复制了i++代码,行和列的内容都是不必要的

#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;
}

Richq已经为您提供了一种更好的实现方法,但让我们看看您在代码中犯了什么错误,看看您的意图,而不是它总是做什么:

你的外环从2到4000。然后为每个数字打印一个表。不是真的,因为你在表中也增加了i,但是让我们忽略它。这有点错误。你只需要一张桌子,所以外环必须走。保持整数i=2;不过

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


第三个循环:col从1变为8。但也许在最后一行,我会在第三行超过4000。因此,如果i<4000是一个硬限制,而不是打印到行尾,即使您已经达到4000,那么您需要将其包括在条件中:col您有什么问题?告诉我们一些事情。没有人比你更了解这些问题。我不知道如何在一个文件的格式良好的表格中获得1-4000之间的所有素数。比如,我如何设置我的代码,让它每行打印8个素数,并一直打印到最后一个数字?不,我们想知道你给我们看的代码有什么问题。代码做了什么,不应该做什么,应该做什么?现在,它只写数字2和3,然后在一个无限的空行循环中运行。现在编辑你的OP并将其放入其中。您不会被否决太多。谢谢您的快速回答。第二个setw的目的是什么?我只是想将输出彼此分开,并将左边距分开。@初学者DEV AFAIK setw为下一个值输出预先设置宽度,但本身不打印任何空格。因此,在下一次迭代中,宽度10将被setw8覆盖。如果要在左侧强制使用空格,请使用std::right修改器将输出数据与用setw定义的字段的右端对齐,如:outputFile。这绝对有道理。
#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;
}