筛法求素数

一般方法:判断一个数n是不是素数,可以用2到√n 以内的所有整数去除n,看能否整除,如果都能整除,则n是素数。(慢)

 

筛法求素数:把2到n中所有的数都列出来,然后从2开始,先划掉n内所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其n内的所有倍数。最后剩下的数,就都是素数。

空间换时间,加快了计算速度。

 变形:设置一个标志数组 isPrime ,isPrime[i]的值是1就表示i是素数。开始数组元素全部为1

           划掉k的倍数,就是把isPrime[2*k], isPrime[3*k]... ,置成0

   最后检查isPrime数组,输出isPrime[i]为1的那些i.

#include <iostream> // 筛法求素数 
using namespace std;
#define MAX_NUM 1000000
char isPrime[MAX_NUM + 10]; // 最终如果isPrime[i]为1,则表示i是素数
int main()
{
    for (int i = 2; i <= MAX_NUM; ++i)
        isPrime[i] = 1;
        for (int i = 2; i <= MAX_NUM; ++i) { //每次将一个素数的所有倍数标记为非素数 
            if (isPrime[i]) //只标记素数的倍数
                for (int j = 2 *i; j <= MAX_NUM; j += i) 
                    isPrime[j] = 0; // 将素数i的倍数标记为非素数 
        } 
        for (int i = 2; i <= MAX_NUM; ++i)
            if (isPrime[i])
                cout << i << endl;
    return 0; 
 } 

 

posted on 2017-09-10 10:15  平行线不会相交  阅读(213)  评论(0)    收藏  举报

导航