难以实现对每行 C++ 上打印的整数数量的限制

Difficulty implementing limit to how many integers print on each line C++

我看到过这个问题,但我在将一些解决方案实施到我自己的代码中时遇到困难。

正在处理的程序查找数组中的所有质数,并计算查找所有质数所需的时间。不过,其中一项规定是让程序每行只打印 10 个数字。我已经尝试了几种不同的方法来让它工作,但是 none 其中打印出我需要它们的方式。这是当前代码:

#include "stdafx.h"
#include <iostream>
#include <time.h>
#include <stdio.h>
using namespace std;

static const int N = 1000;

int main()
{


    int i, a[N];

    clock_t start = clock();

    for (i = 2; i < N; i++) a[i] = i;
    for (i = 2; i < N; i++)
        if (a[i])
            for (int j = i; j*i < N; j++) a[i*j] = 0;

    start = clock() - start;

    for (i = 2; i < N; i++)
        if (a[i]) cout << " " << i;
            if ((i = 1) % 10 == 0)
                cout << "\n";

    printf("\nIt took %d clicks (%f seconds) to find all prime numbers.\n", start, ((float)start) / CLOCKS_PER_SEC);

    return 0;
}

我确定这是我自己的一个简单错误,或者我对它的工作原理没有正确的理解。如果有人能阐明这个问题,我们将不胜感激,谢谢。

只需创建一个新计数器,来计算找到的素数。

int primes = 0;
for (i = 2; i < N; i++) {
    if (a[i]) {
       primes++;
       cout << " " << i;
       if ( primes % 10 == 0)
            cout << "\n";
     }
 }
for (i = 2; i < N; i++)
    if (a[i]) cout << " " << i;
        if ((i = 1) % 10 == 0)
            cout << "\n";

此代码段所做的根本不是您想要的。如果你的 whitespace 是任何迹象,看起来你希望这一切都嵌套在同一个 for 循环中。然而实际上是这样处理的:

for (i = 2; i < N; i++) if (a[i]) cout << " " << i;

if ((i = 1) % 10 == 0) cout << "\n";

换句话说,两个完全独立的语句。第一个遍历 a[i] 的每个元素并用 space 输出它们。当该循环完成时,第二条语句然后检查条件并添加换行符(该检查也被破坏,但我稍后会讨论)。

为了在每第十个元素之后换行,需要为每个元素处理换行符检查,或者至少每个元素 打印,而不是在最后。

正如所写,您似乎期望的实际上是这样的:

for (i = 2; i < N; i++) {
    if (a[i]) cout << " " << i;
    if ((i = 1) % 10 == 0)
        cout << "\n";
}

大括号 { } 在这里很重要,因为它们确保 所有包含的语句 都是 for 循环的一部分,并针对每次迭代进行处理,而不仅仅是单个迭代紧随其后的声明。

这带来了第二个问题:换行符检查没有按照您的想法进行。根据您的解释,您想要的是在每打印十个值时触发检查,并添加一个换行符。但是,if ((i = 1) % 10 == 0)…不会那样做。完全没有。

不是每十个值触发一次,所有 if ((i = 1) % 10 == 0 所做的是将 i 设置为 1(这将真正破坏您的 for 循环)然后永远不会触发,因为 i = 1 将始终return 1 无论如何。这只是一种复杂的方式来做你不想做的事。

一样,一种简单的实现方法是使用每次打印值时递增的计数器,然后对其进行测试:

for (i = 2; i < N; i++) {
    if (a[i]) {
        cout << " " << i;
        primes++;
        if (primes % 10 == 0)
            cout << "\n";
    }
}

再次注意 if (a[i]) 子句中包含三个语句的大括号。这确保增量和换行检查仅在每次实际打印值时发生,而不是 for 循环的每次迭代。