【问题标题】:Prime number generation algorithm素数生成算法
【发布时间】:2011-10-21 09:26:47
【问题描述】:

请查看以下内容,看看您是否可以提供建议。

cout << "2" << endl;
cout << "3" << endl;

ofstream of("Primes.txt");

unsigned long prime = 0;
unsigned long i = 1;
for (i = 1; i < 100000; i++)
{
    prime = ((i*2)+(i+1) + (i % 2));
    of << prime << endl;
}
of.close();
return 0;

计算第n个素数的部分完成公式

第n个质数被吐出,但它的所有质因数也被吐出

如何筛选列表并仅找到素数。

5
7
11
13
17
19
23
25
29
31
35
37
41
43
47
49
53
55
59
61
65
67
71
73
77
79
83
85
89
91
95
97
101
103

好的,我稍微改变了一些方法 - 我将尝试实施 今晚过筛——我现在要去写信息学测试,但是 这是我对一些素数的新实现。

vector<int> Primes;

bool IsPrime(int q)
{
    for(unsigned int i = 0; i < Primes.size(); i++)
    {
        if(q % Primes[i] == 0)
            return false;
    }
    return true;
}

int main()
{
    Primes.push_back(2);
    cout << "2" << " is prime" << endl;
    for (unsigned int i = 2; i < 1000000000; i++)
    {
        if(IsPrime(i))
        {
            Primes.push_back(i);
            cout << i << " is prime" << endl;
        }
    }
}

好的,这确实给出了质数,但确实使用了很多内存。 随着向量变长,随着时间的推移变慢。

【问题讨论】:

  • 请发布一个完整的程序以及预期和实际输出的示例。见sscce.org
  • 您的算法只输出所有等于 +/-1 mod 6 的数字。这与素数无关。
  • @TonyK:它消除了 2 和 3 的倍数,这意味着您可以使用较小的筛选器来找到其他素数。
  • @Mike:我们也知道大多数素数都是奇数。这个程序与打印所有奇数的程序一样有用。

标签: c++ primes


【解决方案1】:

当您查找(小)素数列表时,消除可被素数整除的数字(2、3、5、7 等)是一个不错的主意,但您也应该使用新发现的素数确保列表只包含素数(不仅是 2、3、5、7,还包括那些通过:11、13、17 等)

对于较大的素数(如果数字太大,您将无法计算解释的方式,因为您需要检查从 1 到要检查的几乎所有数字(无论如何每个 4-5),通常的方法是取一个随机的大数并检查它是否通过Fermats Small Theorem 说 3,5,7 和 11 (IIRC 如果它仅通过 3,5,7 和 11 则它是非素数的概率真的不太可能)。

查看Fermats primality test 了解更多解释。

【讨论】:

    【解决方案2】:

    这是最简单的逻辑:

    //Prime Numbers generation in C++
    //Using for loops and conditional structures
    #include <iostream>
    using namespace std;
    
    int main()
    {
    int a = 2;       //start from 2
    long long int b = 1000;     //ends at 1000
    
    for (int i = a; i <= b; i++)
    {
    
     for (int j = 2; j <= i; j++)
     {
        if (!(i%j)&&(i!=j))    //Condition for not prime
            {
                break;
            }
    
        if (j==i)             //condition for Prime Numbers
            {
                  cout << i << endl;
    
            }
     }
    }
    }
    

    【讨论】:

    • 确实很简单。干净易读。谢谢!
    【解决方案3】:
      #include<stdio.h>
    int main(void)
    {int x,i,l;
    printf("number of enter test cases\n");
    scanf("%d",&x);
    if(x>10)
    {
        return;
    }
    printf("enter the range(please do not enter 1)\n");
    int mx[20];
     for(i=0;i<x*2;i=i+2)
     {
         scanf("%d%d",&mx[i],&mx[i+1]);
         if(mx[i]==1)
         {
          return;
         }
         }
           for(l=0;l<x*2;l=l+2){
    
         check(mx[l],mx[l+1]);
       }
      return 0;
    
     }
    void check(int m,int n)
      { //for checking number is prime number or not
      int j,k;
     int flag;
     for(j=m;j<=n;j++)
      {   flag=0;
    for(k=2;k<j;k++)
       {
           if(j%k==0)
             {
             flag++;
             }
      }
         if(flag==0)
       {
          printf("\n%d\n",j);
    
        }
    
     }
    

    【讨论】:

    • 您能否为您的纯代码答案提供上下文?事实上,你正在完成什么并不是很好或很清楚。
    猜你喜欢
    • 2014-01-11
    • 2011-05-08
    • 2015-08-04
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多