如何在C ++中的一行上打印一定数量的值?

时间:2017-07-02 23:19:57

标签: c++ for-loop primes

您好我正在尝试打印从1到4000的所有素数,但我似乎无法弄清楚如何打印8个值然后创建一个新行。我几乎在那里,但由于某种原因,我继续打印8个相同的值,但它确实打印8个数字然后跳到下一行。

我错在哪里打印相同的号码8次?

我认为问题的主要逻辑在于isPrime()函数。如果有人能帮助我,我会很感激。

bool isPrime(int number);
bool isPerfect(int number);

int main()
{

  // Print Prime Numbers
  cout << "PRIME NUMBERS: " << endl;

  int numberOfPrimes = 0, numberOfPerfects = 0;

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

      if(isPrime(i))
      {
          numberOfPrimes++;
      }
  }

  cout << endl << endl;

  cout << "PERFECT NUMBERS: " << endl;

  for (int j = 1; j <= 4000; j++)
  {
      if(isPerfect(j))
      {
          numberOfPerfects++;
      }
  }

  cout << endl << endl;
  cout << "The total number of primes form 1 to 4000 is " << numberOfPrimes << endl << endl;
  cout << "The total number of perfects from 1 to 4000 is " << numberOfPerfects << endl << endl;

}

bool isPrime(int number) {

    bool numberIsPrime = true;

    for (int i = 2; i * i <= number; i++)
    {
        if (number % i == 0)
        {
            numberIsPrime = false;
            return numberIsPrime;
            break;
        }

    }


     if (numberIsPrime) 
    {  
        int count = 0;
        for (int j = 0; j <= 7; j++)
        {
            count++;
            cout<< setw(6) << number << " ";

            if (count % 7 == 0)
            {
                cout << endl;
            }
        }
    }



    return numberIsPrime;

}

bool isPerfect(int number)
{
    int i = 1, sum = 0;
    bool numberIsPerfect = false;

    while( i < number)
    {
        if (number % i == 0)
        {
            sum = sum + i;
        }

        i++;
    }

    if (sum == number)
    {
        numberIsPerfect = true;
        cout << setw(6) << number << " ";
    }

    return numberIsPerfect;

}

输出

PRIME NUMBERS: 
 2      2      2      2      2      2      2 
 2      3      3      3      3      3      3      3 
 3      5      5      5      5      5      5      5 
 5      7      7      7      7      7      7      7 
 7     11     11     11     11     11     11     11 
11     13     13     13     13     13     13     13 
13     17     17     17     17     17     17     17 
17     19     19     19     19     19     19     19 
19     23     23     23     23     23     23     23 
23     29     29     29     29     29     29     29 
29     31     31     31     31     31     31     31 
31     37     37     37     37     37     37     37 
37     41     41     41     41     41     41     41 
41     43     43     43     43     43     43     43 
43     47     47     47     47     47     47     47 
47     53     53     53     53     53     53     53 
53     59     59     59     59     59     59     59 
59     61     61     61     61     61     61     61 
61     67     67     67     67     67     67     67 
67     71     71     71     71     71     71     71 
71     73     73     73     73     73     73     73 
73     79     79     79     79     79     79     79 
79     83     83     83     83     83     83     83 
83     89     89     89     89     89     89     89 
89     97     97     97     97     97     97     97 

它继续完成正确的素数但重复的值。

2 个答案:

答案 0 :(得分:3)

您的代码结构不合理。打印任何东西都不是isPrime()的工作。 isPrime()如果参数是素数,则返回true,并且不执行任何其他操作。然后在调用代码中如果是素数,则应打印数字,计算到目前为止你已在行中打印的素​​数的数量,并且当它达到8或每行所需的数量时,将该行和零计数归零。

事实上,即使拥有 isPrime()方法也是不好的做法。通过Eratosthenes的Sieve,在一次通过范围内生成范围内的所有素数,并且然后打印它们,而不是按顺序查询范围中的每个数字,效率要高几个数量级。为了优越感。

答案 1 :(得分:1)

  

我错在哪里打印相同的号码8次?

在以下for;你打印8次相同的素数number

    for (int j = 0; j <= 7; j++)
    {
        count++;
        cout<< setw(6) << number << " ";

我认为这是静态变量

的工作
bool isPrime (int number)
 {
   static int count { 0 };

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

   cout << setw(6) << number << " ";

   if ( ++count == 8 )
    {
      cout << endl;

      count = 0;
    }

   return true;
 }

或(恕我直言,好一点)

bool isPrime (int number)
 {
   static int count { 0 };

   bool isP { true };

   if ( number == 2 ) // 2 is prime !
      ;
   else if ( 0 == (number & 1) ) // is divisible by 2 ?
      isP = false;
   else
    {
      int sq = std::sqrt(number); // calculare square root only one time

      // try dividing by odd number only
      for ( int i { 3 } ; i <= sq ; i += 2 ) 
         if ( number % i == 0 )
            isP = false;
    }

   if ( isP )
    {
      std::cout << setw(6) << number << " ";

      if ( 0 == (++count & 7) ) // is divisible by 8 ?
         std::cout << std::endl;
    }

   return isP;
 }