我目前正在解决一个非常简单的问题:我需要找到最多为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;
}
}
}
答案 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位数:
对于这些模式中的每一个,您可以通过在外循环中迭代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)
。