对筛法求素数的实现代码(Python及C++)

Python:

# -*- coding: utf-8 -*-
# 算法:对筛法
# 求素数

# 算法基本原理:
# 求n以内的素数,则将2到sqrt(n)的素数的倍数均除去,留下的即为素数
# 未优化,优化后可以进一步降低时间复杂度
# 时间复杂度 O(nlog(logn))
# 空间复杂度 O(n)

import math

limit = 10000000
flag = int(math.sqrt(limit))
L = [True for i in xrange(2, limit)]

def sieve(x):
    for i in xrange(x*x, limit - x, x):
        L[i] = False

def foo():
    map(sieve, xrange(2, flag, 1))

if __name__ == "__main__":
    import profile
    profile.run("foo()")

C++:

/*
 * 对筛法,求n以内的素数
 *
 * 算法基本思想:对2到n的数,筛去其中2到sqrt(n)的中素数
 * 的倍数,即可获得最终的素数
 *
 * 以下是C++语言实现代码
 * 未经过优化,时间空间效率较差
 * 
 * 可以的优化思路:bool数组可以使用无符号数字表示,其中
 * 每一个bit表示真假,可节省空间
*/
#include 
#include 

using namespace std;

int main ()
{
	long limit = 1000000;
	float flag = sqrt(limit);

	bool prime[limit];
	for (int i = 0; i < limit; i++)
		prime[i] = true;
	
	prime[0] = false;
	prime[1] = false;

	for (int i = 2; i < flag; i++)
	{
		for (int j = i * i; j < limit; j += i)
			prime[j] = false;
	}

	int count = 0;
	for (int i = 0; i < limit; i++)
	{
		if (true == prime[i])
		{
			cout << i << "\t";
			count++;
			if (0 == count % 5)
			{
				cout << endl;
				count = 0;
			}
		}
	}
	
	cout << endl;
	return 0;
}

你可能感兴趣的:(算法)