繁体   English   中英

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

[英]Printing all prime numbers between 3-100 in 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;
}

问题是:

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;

当您将prime设置为false表示单个数字不是质数时,就永远不会再次将prime设置为true。

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

prime = true;

当前,您永远不会将prime标志重置为true ,因此,当您达到4并将prime设置为false ,由于prime 始终false ,因此它永远不会“查找”素数。

完整代码:

#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;
}

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

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

}

您永远不会将素数重置为真实。 发出提示后,您需要执行prime = true;

尝试这个。

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;
     }    
}

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

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

以前基本上是这样做的:

if ((x % y) == 0)
{
    prime = false;
}
break; // WRONG!   
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;
}

您需要在循环内部设置质数,并且想要将其设置为false并在内部循环中终止测试。

即使代码块为一行,即使您可以跳过花括号,旧手的笔尖编号45623也不要。

每个人都说这两个错误:

1)你永远不重置价值prime ,所以加一个prime = true开始外for
2)转换if ((x % y) == 0) prime = false; break; if ((x % y) == 0) prime = false; break; if ((x % y) == 0) {prime = false; break;} if ((x % y) == 0) {prime = false; break;}否则,内部for将仅执行一次!

这是一个用于打印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();
}                 

为了提高效率,请尝试使用它的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+" ");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM