很难实现限制每行打印多少个整数

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

本文关键字:打印 多少 整数 实现 很难      更新时间:2023-10-16

我看到过这个问题,但是我很难在自己的代码中实现一些解决方案。

正在处理的程序查找数组中的所有素数,并乘以查找所有素数所需的时间。其中一个规定是让程序每行只打印10个数字。我尝试了几种不同的方法来实现这一点,但没有一种方法可以打印我需要它们的方式。下面是当前代码:

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

这段代码所做的并不是你想要它做的。如果您的空格有任何指示,那么看起来您希望所有这些都嵌套在同一个for循环中。然而,它实际上是这样处理的:

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

换句话说,两个完全独立的语句。第一个遍历a[i]的每个元素并输出一个空格。当循环完成时,第二个语句检查一个条件并添加一个换行符(该检查也被打破,但我将在后面讨论)。

为了在每10个元素之后换行,需要对每个元素进行换行检查,或者至少对每个元素打印,而不是在末尾。

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

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

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

这就引出了第二个问题:换行符检查并没有按照您的想法执行。从您的解释来看,您想要的是每打印10个值触发一次检查,并添加一个换行符。然而,if ((i = 1) % 10 == 0) …不这样做。。

而不是每10个值触发一次,所有if ((i = 1) % 10 == 0所做的是将i设置为1(这将真正打破你的for循环),然后永远不会触发,因为i = 1无论如何总是返回1。这只是一种让人费解的方式,让你做了你不想做的事。

正如Amadeus提到的,实现这一点的一种简单方法是使用一个计数器,每次打印一个值时都加1,并根据它进行测试:

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

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