用于显示素数的程序

时间:2014-03-18 16:42:09

标签: c++ function primes

我必须创建一个函数,它使用两个先前引用的输入来显示两个数字之间的所有素数,输入称为imin,imax和我们给出的代码部分是

cout << "Primes:";
for (int j = imin; j <= imax; j++) {
    if (is_prime(j))
    {
         cout << "  " << j;
    }
}

应该由我们自己编写的函数补充,我所做的部分在

之下
bool is_prime( int j)
{
    bool primes(false);
    for (int k = 2; k < j; k++)
    {        
        if (j%k == 0) // if (k mod j == 0)
        {
             primes = true;
        }
        else if (j%k !=0)
        {
            primes = false;
        }
    }
    return true;
}

我需要帮助才能显示素数,因为它现在显示所有数字。感谢您对我的帮助,所以希望我足够具体。

7 个答案:

答案 0 :(得分:4)

你职能的最后一行: 返回true

无论数字是否为素数,

总是返回true,这就是显示所有数字的原因。如果您传递任何号码&#39; n&#39;作为 is_prime(n)的参数,它将始终返回true。

答案 1 :(得分:2)

我找到了三个错误:

  • 数字应该被认为是素数,除非你能证明不是(找一个除数) - 行:bool primes(false);
  • 如果您找到除数,则数字不是素数 - j%k == 0,但在您的代码中,您有相反的内容
  • 当您证明某个数字不是素数时,则无需继续计算

答案 2 :(得分:1)

#include <iostream>

using namespace std;

bool is_prime( int j)
{
    bool primes(true);
    for (int k = 2; k < j; k++)
    {        
        if (j%k == 0) // if (k % j == 0)
        {
             primes = false;
        }

    }
    return primes;
}

int main( void )
{
int imax = 100;
int imin = 1;

cout << "Primes:";

for (int j = imin; j <= imax; j++) {
    if (is_prime(j))
    {
         cout << "  " << j;
    }
}

return 0;
}

答案 3 :(得分:1)

自己写这个函数比用坏英语解释为什么你的函数错误更简单。:)

bool is_prime( unsigned int value )
{
    bool prime = ( value == 2 ) || ( value % 2 && value != 1 );

    for ( unsigned int j = 3; prime && j < value / 2; j += 2 )
    {
        prime = value % j != 0;
    }

    return prime;
}

for语句可以作为

for ( unsigned int j = 3; prime && j * j <= value; j += 2 )

答案 4 :(得分:1)

您的代码中有一些错误。

首先,当j%k等于零时,该数字不是素数。 其次,你必须处理数字inf到2号。他们需要特殊待遇。

我在你的代码中添加了一些内容。请看一下:

bool is_prime(int j)
{
  for (int k = 2; k < j; k++)
    if (j % k == 0)
      return (false);
  if (j < 2)
    return (false);
  return (true);
}

让我们看看它如何与一个例子一起使用!

如果数字(j)小于2,则该函数将跳过循环并返回false。说这个数字不是素数。

如果数字(j)高于2,则该函数将进入循环。循环如何工作?

假设j是数字5,这是循环:

   if (j % k == 0) With k moving from 2 to (j - 1) so 4

   if (5 % 2 == 0) -> false, loop continue
   if (5 % 3 == 0) -> false, loop continue
   if (5 % 4 == 0) -> false, loop continue

循环停止原因k等于j。    函数返回true,数字5是素数。

现在假设j是数字10,让我们看看有什么变化:

  if (j % k == 0) With k moving from 2 to (j - 1) so 9

  if (10 % 2 == 0) -> true, function return false

10号不是素数

如果您有任何疑问,欢迎您。 :)

答案 5 :(得分:1)

你的代码中有错误,素数只有两个因子是1和数字本身,所以代码应该如下:

bool is_prime( int j)
{
    bool primes(false);
    for (int k = 2; k < j; k++)
    {        
        if (j%k == 0) // if (k mod j == 0)
        {
             primes = false;
             break; //if number is divisible in between then retrun false and break the loop
        }
        else if (j%k !=0)
        {
            primes = true;
        }
    }
    return primes;
}

尝试使用该代码并告知我是否发生错误

答案 6 :(得分:0)

首先,你应该删除任何甚至主要候选人:

if (imin < 2) // no primes < 2 :
    return;

cout << "Primes:";
if (imin == 2)
    cout << "  " << i;

imin = imin + ((imin & 0x1) == 0); // advance to next odd number.

这允许您使用以下方法测试素数:

for (int j = imin; j <= imax; j += 2) // odd candidates (j > 2) only:
{
    if (is_prime(j))
         cout << "  " << j;
}

请注意,如果j足够大,有更有效的方法来测试素数。但是,如果您希望最少的代码有效,则只需要测试最高floor(sqrt(j))的素数因子:

bool is_prime (int j)
{
    // assert (j > 2 && (j & 0x1) == 1); // j > 2, j in odd:

    int d, q, c = 0;

    for (d = 3; !c && (q = j / d) >= d); d += 2)
        c = (q * d == j); // sets c <- 1 if 'd' is a factor of 'j'

    return (c == 0); // prime (true - no 'd' factor) or composite (false)
}