筛法求素数

筛法描述:

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

思路:

  • 设置一个标志数组 is_prime, is_prime[i] 的值是 1 就表示 i 是素数,开始数组元素值全部为 1
  • 划掉 k 的倍数, 就是把 is_prime[2k], is_prime[3k] …… 标记为 0
  • 最后检查 is_prime 数组,如果is_prime[i] 值为 1 那么 i 就是素数

实现:

// 筛法求素数
#include <iostream>
#include <cstdio>
using namespace std;

const int max_size = 1000;
// 大数组定义在外面
char is_prime[max_size+1]; // 最终如果 is_prime 为 1,则表示 i 是素数

int main(void)
{
    int i, j;
    for (i=2; i<max_size+1; i++){   // 开始假设所有数都是素数
        is_prime[i] = 1;
    }
    
    for(i=2; i<max_size+1; i++){    // 每次将一个素数所有的倍数标记为非素数
        if (is_prime[i] == 1){  // 只标记素数的倍数
            for (j=2*i; j<max_size+1; j+=i){
                is_prime[j] = 0;    // 将素数 i 的倍数标记为非素数
            }
        }
    }
    
    for (i=2; i<max_size+1; i++){
        if (is_prime[i] == 1){
            cout << i << endl;
        }
    }
    return 0;
}

筛法是一种一空间换取时间的方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,860评论 0 33
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,217评论 0 41
  • 好吧,我承认今晚确实低气压。无精打采,戴耳机写点东西,释放压力?呵呵 下车上班,下班上车,忙碌的毫无闲...
    卫家二幺阅读 442评论 0 0
  • 舒家别苑造于江陵郊外,独伫于俦山,春时多雾,云烟缭绕,远观真似仙山一般。此时已是夏初,清晨依然薄雾霏霏,晨曦现出第...
    火星小说阅读 800评论 0 2
  • 随着时间的推移,短短十几年间,电脑发展迅速,从最初的386、486,到现在的iPad, Mac。操作系统也从D...
    笔女阅读 484评论 0 1

友情链接更多精彩内容