在C ++中打印3到100之间的所有素数

时间:2012-10-12 22:01:12

标签: c++

我这里有代码,程序列出3-100的所有素数。我的主要问题是该程序只打印出三个。我认为由于某种原因它会离开循环或其他东西。我在for语句中放了一个中断,一旦发现数字不是素数就立即离开内部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;
}

11 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

当你将prime设置为false表示单个数字不是素数时,你永远不会再将prime设置为true。

答案 2 :(得分: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;
}

答案 3 :(得分:1)

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

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

}

答案 4 :(得分:1)

你永远不会重置素数是真的。在你cout之后你需要做     prime = true;

答案 5 :(得分: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;
     }    
}

答案 6 :(得分:0)

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

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

以前基本上是这样做的:

if ((x % y) == 0)
{
    prime = false;
}
break; // WRONG!   

答案 7 :(得分: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,即使你可以跳过括号如果代码块是一行,也不要。

答案 8 :(得分:0)

正如每个人都这样说你有2个错误:

1)您永远不会重置prime的值,因此请添加prime = true以开始外for
2)将if ((x % y) == 0) prime = false; break;转换为if ((x % y) == 0) {prime = false; break;},否则将只执行一次!!

答案 9 :(得分: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();
}                 

答案 10 :(得分: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+" ");
    }