在素数中找到101

时间:2017-11-20 10:14:59

标签: c++ algorithm

我目前正在解决一个非常简单的问题:我需要找到最多为N的所有素数,其中包含101并计算它们。 假如如果N是1000则输出应该是6,因为有101,1013,1015,5101,6101和8101.我使用筛选算法来获得所有素数达到N,尽管我没有&#39 ;我知道如何完全解决它。我想到了std :: find,但是因为时间复杂度增长很快而辞去了这个想法。我知道我需要修改筛选算法以满足我的需求,尽管我找不到任何模式。 任何帮助,将不胜感激。 编辑: 我使用这个算法:

vector<int> sieve;
vector<int> primes;

for (int i = 1; i < max + 1; ++i)
   sieve.push_back(i);   // you'll     learn more efficient ways to handle this later
sieve[0]=0;
for (int i = 2; i < max + 1; ++i) {   // there are lots of brace styles, this is mine
   if (sieve[i-1] != 0) {
      primes.push_back(sieve[i-1]);
      for (int j = 2 * sieve[i-1]; j < max + 1; j += sieve[i-1]) {
          sieve[j-1] = 0;
      }
   }
}

2 个答案:

答案 0 :(得分:0)

您不需要修改素数生成算法。处理素数时,你必须检查素数是否满足你的条件:

e.g。

// p is the prime number
if (contains(p))
{
   // print or write to file or whatever
}

使用:

bool contains(int);

检查您情况的功能

答案 1 :(得分:0)

是的,检查包含&#34; 101&#34;的每个素数。是浪费时间。生成包含101的所有数字并检查它们是否为素数可能更快。

为了生成101个数字,让我们看看可能的数字模式,例如:有5位数:

  • nn101
  • n101m
  • 101毫米

对于这些模式中的每一个,您可以通过在外循环中迭代n并在内循环中迭代m来获取所有数字并进行数学计算以获得模式的值(当然,您甚至不需要考虑m值,因为唯一的素数是2)。当值达到N时,您就完成了。

要检查是否为素数,一种简单的方法是根据需要使用筛子准备所有素数列表M=sqrt(N),并检查您的值是否可以被其中一个整除。

这应该在O(N^1.5)中运行。为什么?模式的数量随着O(logN)的增长而变化,每个模式中的迭代次数都会增加N/1000,得到O(N),质数最多为M的素数检查,为{{{ 1}},用筛子O(M/log(M))找到这些素数。完全是O(M^2)O(N * log(N) * sqrt(N) / log(sqrt(N)) + N)