日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

筛选法求素数

發(fā)布時(shí)間:2023/12/19 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 筛选法求素数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

來自:【數(shù)據(jù)結(jié)構(gòu)與算法分析——C語言描述】練習(xí)2.14

問題描述:Eratosthenes篩是一種用于計(jì)算小于N的所有素?cái)?shù)的方法。我們從制作整數(shù)2到N的表開始。我們找出最小的未被刪除的整數(shù)i,打印i,然后刪除i, 2i, 3i, ..., 當(dāng)i > √N(yùn)時(shí),算法終止。

首先,沒必要做2到N的表,在一個(gè)循環(huán)內(nèi)遍歷2到N即可。

其次,所謂最小也沒必要判斷,依次遍歷時(shí)整數(shù)i自然是它到最后一個(gè)數(shù)之間的最小值。

最后,整數(shù)i是否被刪除等價(jià)于整數(shù)i是否素?cái)?shù)flag[i]==1或0表示,1表示素?cái)?shù),0表示非素?cái)?shù)。

思路:如果整數(shù)i是素?cái)?shù),打印它,然后刪除它的倍數(shù)。i==2時(shí)刪除2的倍數(shù),等于3時(shí)刪除3的倍數(shù),等于5時(shí)刪除5的倍數(shù),... ,直到N為止。

void Eratosthenes(int N)
{
    char * flag;
    int i, j;

    flag = (char *)malloc(sizeof(char)*N);
    memset(flag, '1', sizeof(char)*N);

    for (i = 2; i < N; i++)
    {
        if (flag[i] == '1')
        {
            printf("%d	", i);
            for (j = 2; j*i < N; j++)    //刪除素?cái)?shù)i的倍數(shù)
                flag[j*i] = '0';
        }
    }
    free(flag);
}

測試結(jié)果:

其中數(shù)據(jù)IO花費(fèi)了不少的時(shí)間。

這是篩選法最簡單的思路之一,還可以繼續(xù)優(yōu)化,比如:因?yàn)槌?所有的偶數(shù)都不是素?cái)?shù),所以可以排除一半的數(shù)據(jù)量。也可以對外層循環(huán)只遍歷到根號N,可以減小循環(huán)的規(guī)模。

總結(jié)

以上是生活随笔為你收集整理的筛选法求素数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。