筛法求素数
一般方法:判断一个数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; }
人一我百,人十我万!自己选择的路,跪着也要走完。
浙公网安备 33010602011771号