2

这是我的任务:素数是一个大于 1 的数,它只能被 1 和它自己整除。对于这个作业,您会发现从 2 到 n(其中 n 是用户指定的数字)中的哪些数字是素数。

向用户询问一个大于 2 的数字 n。继续询问一个数字,直到提供一个大于 2 的数字。假设用户只会输入数字(也就是说,您不需要检查用户是否输入了文本)。

使用循环从 2 到 n 迭代变量 i。对于每次迭代,检查从 2 到 i 的所有数字以确定该数字是否为素数。如果是素数,打印出 i 和单词“素数”。

使用模运算符 % 来确定一个数是否为素数

这是我到目前为止所拥有的。它不起作用。我不知道为什么。请帮忙,我是一名将基本编程作为选修课的商科学生。

#include <iostream>

using namespace std;

int main()
{
  int n;
  int i;
  int x;

  while (n<=2)
  {
    cout << "Enter a number greater then 2: \n";
    cin >> n;

    for (x=n; x>=2; x--)
    {
      bool prime = false;
      for (i=2; i<x; i++)
      { 
        if (x%i==0)
        {
          prime = true;
        }
      }
      if (prime==false)
      {
        cout << x << " Prime.\n";
      }
    }
  }
  return 0;
}
4

5 回答 5

0

我实际上并没有使用你的代码,因为它有点难以阅读。但是我为你写了一个新方法。我建议始终将您的代码划分为方法以使其更易于管理。您可以在您的主要方法中调用它

bool checkPrime(int number)
{   // input:   num an integer > 1
    // Returns: true if num is prime
    //          false otherwise.

    int i;

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

    return true;    
}

以下是您如何在主中调用此方法:

int main() {

int number;

cout << "Enter an integer (>1): ";
cin >> number;

if (checkPrime(number))
{
    cout << number << " is prime." << endl;
}
else
{
    cout << number << " is not prime." << endl;
}

// I think this is more convention than anything.
return 0;

}

于 2013-10-15T07:05:05.470 回答
0

请说,为什么它让你说它不起作用?其中,我得到了这个输出。

Enter a number greater then 2: 
100
97 Prime.
89 Prime.
83 Prime.
79 Prime.
73 Prime.
71 Prime.
67 Prime.
61 Prime.
59 Prime.
53 Prime.
47 Prime.
43 Prime.
41 Prime.
37 Prime.
31 Prime.
29 Prime.
23 Prime.
19 Prime.
17 Prime.
13 Prime.
11 Prime.
7 Prime.
5 Prime.
3 Prime.
2 Prime.

但是由于int n;未初始化 n,因此可能不会进入 while 循环。

于 2013-10-15T07:22:25.460 回答
0

它可能不是那里的最佳程序,但这应该有效:

#include <iostream>

using namespace std;

int main()
{
int n;
int i;
int x;

cout << "Enter a number greater then 2: \n";
cin >> n;

while (n<=2)
{
 cout << "Enter a number greater then 2: \n";
 cin >> n;
}

for (x=n; x>=2; --x)
{
  for (i=2; i<x; ++i)
  { 
    bool prime = true;
    for (j=2; j<i/2; ++j)
    { 
       if (i%j==0)
       {
         prime = false;
         break;
       } 
    }
    if (prime)
    {
       cout << j << " Prime.\n";
    }
  }
}
return 0;
}
于 2013-10-15T07:18:56.677 回答
0

有两种简单的方法可以加快速度:首先不需要测试太大的潜在除数(正如 arne 指出的那样),其次,不需要测试除 2 之外的偶数。

像这样的东西:

#include <cassert>
bool is_prime(unsigned n)
{
  if (n == 2)
    return true;
  if (n <= 1
      || n % 2 == 0)
    return false;
  for (int d = 3; d * d < n; ++d)
    if (n % d == 0)
      return false;
  return true;
}

int main()
{
  assert(!is_prime(0));
  assert(!is_prime(1));
  assert(is_prime(2));
  assert(is_prime(3));
  assert(!is_prime(4));
  assert(is_prime(5));
  assert(!is_prime(6));

  assert(!is_prime(256));
  assert(is_prime(257));
}

当然,更快的是建立一个素数表,并使用这个表作为潜在的除数,而不是每个奇数。如果您有几个数字要检查,这是有道理的。

于 2013-10-15T07:19:08.427 回答
-1

我认为答案 1 函数 checkprime(int number) 可以改进,但纯粹基于性能,考虑素数不能是偶数的事实。因此,如果添加额外的检查以查看 (number % 2 == 0) 是否会减少很多for 循环的迭代,对于其余部分,我认为将循环从 2 迭代到 9 就足够了,而不是从 2 迭代到 n。太多的迭代会减慢你在更大的数字上的速度。

于 2013-10-15T07:23:20.297 回答