题目:打印前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,校招,笔试