题目:打印前N个素数,不需要考虑大数和溢出
思路:从2开始,依次检测后续的每个数,若为素数,计数加1,直到计数到N。
分析:问题复杂度的瓶颈在于判断一个数是否为素数。鉴于前面的素数已经找出,可以将所有找出的素数保存下来,在判断一个数x是否为素数时,只需判断该数x是否能整除[2,sqrt(x)]内的所有素数即可。
/*
* 打印前N个素数
* 不需要考虑大数和溢出的情况
*
*/
#include <vector>
#include <stdio.h>
#include <math.h>
void print_prime(int N)
{
if (N < 1) return;
std::vector<int> primes;
int num = 2;
int count = 1;
primes.push_back(num);
printf("%d ", num);
while (count < N)
{
bool isPrime = true;
++ num;
int sqr = (int)std::sqrt((float)num);
for (std::vector<int>::iterator iter = primes.begin();
iter != primes.end() && *iter <= sqr;
++ iter)
{
if (num % *iter == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
++ count;
primes.push_back(num);
printf("%d ", num);
}
}
}
PS: Google,2013,校招,笔试
本文介绍了一种高效算法来打印前N个素数。通过维护已知素数列表并利用这些素数来检查新数的素性,该算法能够减少不必要的计算。文章提供了完整的C++实现代码。
3158

被折叠的 条评论
为什么被折叠?



