1

我在这里有代码让程序列出从 3 到 100 的所有素数。我的主要问题是程序只打印出三个。我认为由于某种原因它正在离开循环或其他东西。我在 for 语句中放了一个 break ,让它在发现数字不是素数时立即离开内部 for 循环,以便它可以打印出来。但是,它似乎不起作用。

#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

int main()
{
    bool prime = true;

    for (int x = 3; x <= 100; x++)
    {
        for (int y = 2; y <= (x - 1); y++)
        {
            if ((x % y) == 0)
                prime = false;
            break;
        }

        if (prime == true)
            cout<<x<<endl;
   }

    getche();
    return 0;
}
4

11 回答 11

6

问题是:

for (int y = 2; y <= (x - 1); y++)
{
    if ((x % y) == 0)
        prime = false;
        break;
}

什么时候应该

for (int y = 2; y <= (x - 1); y++)
{
    if ((x % y) == 0)
    {
        prime = false;
        break;
    }
}

prime除非满足第一个条件,否则每次设置为 true 都会中断。

您还必须prime在每次迭代时重置为 true:

for (int x = 3; x <= 100; x++)
{
    prime = true;
于 2012-10-12T22:12:07.300 回答
2

当您将 prime 设置为 false 以表示单个数字不是素数时,您再也不会将 prime 设置为 true。

于 2012-10-12T22:05:11.580 回答
2

在第一个 for 循环内的第一行,输入:

prime = true;

目前,您从未将prime标志重置回true,因此当您达到 4 并设置prime为 时false,它永远不会“找到”之后的素数,因为prime总是错误的。

完整代码:

#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

int main()
{
    bool prime = true;

    for (int x = 3; x <= 100; x++)
    {
        prime = true;
        for (int y = 2; y <= (x - 1); y++)
        {
            if ((x % y) == 0)
            {
                prime = false;
                break;
            }
        }

        if (prime == true)
            cout<<x<<endl;
    }

    getche();
    return 0;
}
于 2012-10-12T22:05:29.393 回答
1

在第一个循环之后初始化prime=true; . 因为一旦素数是假的,它就不会再变真了。

for (int x = 3; x <= 100; x++)
{
     prime=true;
     ///rest of the code

}
于 2012-10-12T22:07:27.527 回答
1

您永远不会将素数重置为真实。在你 cout 之后,你需要做 prime = true;

于 2012-10-12T22:07:48.007 回答
0

这是打印 3 到 100 之间的素数的代码。使用计数器变量 n 而不是一般算法来查找素数。

#include <iostream.h>
#include <conio.h>

int main() {
    int i;
    int j;
    clrscr();
    int count=0;
    for(j=100; j>=3; j--) {
        for(int i=1; i<=j; i++) {
            if(j%i==0)
                count++;
        }
        if(count==2)
            cout<<"\n"<<j;
        count=0;
    }
    getch();
}                 
于 2012-10-29T14:51:59.227 回答
0

内部循环将始终调用 break 语句,因为 IF 只执行第一行,因为它没有用括号括起来。您还需要为每个数字重置 bool 变量(即在第一个循环内)

if ((x % y) == 0)
{
    prime = false;
    break; // previously it was always breaking
}

以前它基本上是这样做的:

if ((x % y) == 0)
{
    prime = false;
}
break; // WRONG!   
于 2012-10-12T22:13:27.020 回答
0
int main()
{

  for (int x = 3; x <= 100; x++)
  {
    bool prime = true;
    for (int y = 2; y <= (x - 1); y++)
    {
      if ((x % y) == 0)
      {
          prime = false;
          break;
      }
    }

    if (prime == true)
    { 
      cout<<x<<endl;
    } 
  }

  getche();
  return 0;
}

您需要在循环内设置 prime,并且您想将其设置为 false 并在内部循环中的测试中中断。

老手的提示编号 45623,即使如果代码块是一行,您可以跳过大括号,但不要。

于 2012-10-12T22:14:55.727 回答
0

为了效率,试试这个它的 java 版本,但你可以为 C 尝试相同的逻辑。

    boolean prime;
    int iCount = 0;
    int jCount = 0;
    for(i = 2; i <= 100; i++)
    {
        iCount +=  1;

      prime = true;
      int squared = (int) (Math.sqrt(i));

      for(j = 2; j < squared; j++){
          jCount += 1;

        if(i%j == 0) prime = false;
      }
      if(prime) System.out.print(i+" ");
    }
于 2014-10-04T11:47:35.260 回答
0

尝试这个。

for (int x = 3; x <= 100; x++)
{
     for (int y = 2; y <= (x - 1); y++)
     {
         if ((x % y) == 0)
         break;
         if((x-1)==y)
         cout<<x<<endl;
     }    
}
于 2012-10-12T22:09:26.877 回答
0

正如每个人所说的那样,您有两个错误:

1)您从不重置 的值prime,因此将 a 添加prime = true到 outer 的开头for
2)转换if ((x % y) == 0) prime = false; break;if ((x % y) == 0) {prime = false; break;}internal for 将只执行一次!!

于 2012-10-12T22:23:10.313 回答