求第N个素数的值,时间复杂度尽量低

今天纠结了整整一下午的这个题,当心不静的时候,世界就更加浮躁。也许不应该这样,但是如果能时刻控制自己,那现在的我应该在家里等待笔试而不是在这里。。。

先看题:输入一个数字N,输出第N个素数的值。素数(除了1和他自己不能被其他数整除的数)

这道题有很多解法,比如暴力,N的平方的解法,但是这样的解法当数字很大的时候,其效率太差。当然对于N的平方的解法可以做一些优化,其实我们第二次只需要遍历到根号N的时候就可以了,而不用全部遍历,这样可以提高一部分效率。在此基础上,还可以,我们第二次遍历的时候有意的跳过偶数,奇数遍历到根号N的地方就好。

这些方法都可以,今天我用的方法叫什么什么算法,反正是一位希腊的大牛开发出来的,思想很简单。大体是:从2开始,将2的倍数全部标记起来,他们不是素数,然后从3开始,将3的倍数标记起来,他们也不是。然后应该到4,但是4被标记过了,所以到5,将5的倍数标记起来,,,以此类推,一直到10。然后遍历这些标记过的数据,没有标记的就是我们要求的素数。这是典型的空间换时间的算法,思路很简单。


#include <iostream>
#include <vector>
using namespace std;
#define MAX 10000

int Find_n(int n)
{
	vector<bool> ve;
	ve.resize(MAX);
	int ar[] = {2,3,5,7};
	
	int j = 0;
	for(int i = 2; i <= 10; i++)
	{
		if(i == ar[j])
		{
			int ve_i = i * 2;
			for(int k = 2; ve_i < MAX; k++)
			{
				ve[ve_i] = 1;
				ve_i = k * i;
			}
			j++;
		}
	}
//上述代码进行标记。
	int h;
	n--;
	for(h = 2; h < MAX && n; h ++)
	{
		if(!ve[h])
			n--;
	}
	if(h < MAX)
		return h-1;
	else
		return -1;
}
int main()
{
	int n;
	cin>>n;
	cout<<Find_n(n)<<endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值