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