打印前N个素数

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值