【问题标题】:Difficulty implementing limit to how many integers print on each line C++难以实现对每行 C++ 打印的整数数量的限制
【发布时间】:2017-02-19 09:37:47
【问题描述】:

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

正在处理的程序查找数组中的所有素数,并计算查找所有素数所需的时间。但其中一项规定是让程序每行只打印 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;
}

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

【问题讨论】:

    标签: c++ loops printing integer limit


    【解决方案1】:

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

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

    【讨论】:

    • 完美运行!我不知道该怎么感谢你。
    【解决方案2】:
    for (i = 2; i < N; i++)
        if (a[i]) cout << " " << i;
            if ((i = 1) % 10 == 0)
                cout << "\n";
    

    这个 sn-p 所做的根本不是你想要的。如果您的空格有任何迹象,那么您似乎希望这一切都嵌套在同一个 for 循环中。然而,它实际上是这样处理的:

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

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

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

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

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

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

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

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

    作为Amadeus mentions,实现这一点的一种简单方法是使用每次打印值时递增的计数器,并对其进行测试:

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

    同样,请注意括住if (a[i]) 子句的三个语句的大括号。这确保了每次实际打印值时才进行增量和换行检查,而不是 for 循环的每次迭代。

    【讨论】:

    • 感谢您花时间为我深入解释这一点。我设法让 Amadeus 的代码 sn-p 工作,但一开始我并没有 100% 理解我的代码出了什么问题。洞察力真的很有帮助!
    • 其实我还有一个问题,因为您似乎对这个主题很了解。有没有一种简单的方法可以让我运行相同的代码,但数组的类型为 char 或 bool?
    • @Wil 它与类型无关。它适用于任何类型的值,只要 if (a[i]) 检查仅预计检测到“0/false/nothing”和“1/true/something”之间。否则,只需将其更改为 if (a[i] == whatever_condition) 即可过滤掉正确的值。
    • 好的,我试一试。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-16
    • 2018-06-15
    • 2018-06-25
    • 2021-03-20
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多