列印素數的幾種方法及其優化

2021-08-22 07:08:51 字數 1932 閱讀 4116

題目:列印從第n個素數到第m個素數之間的素數(每十個換行)

1. 試除法(傻瓜法)

所謂試除法,就是從頭到尾乙個乙個判斷是不是素數,並且在判斷素數時,從2一直試除到n-1

#define max 10000

#include

void prime_number(int arr)

}if (j == i)}}

int main()

;scanf("%d

%d", &n, &m);

prime_number(arr);

for (int i = n - 1; i < m; i++)

if (i == m - 1)

}system("pause");

return

0; }

優化一:

但是我們發現,實際上在判斷素數 (i) 的時候,只需要從2到 i / 2即可,再往後就會判斷重複。工作量會減少一半

void prime_number(int arr)

}if (j == (i / 2 + 1)) //修改部分}}

優化二:

我們知道乙個數的因數是成對出現的,那麼我們只需要判斷其中乙個即可(判斷小的因數),並且小的因數一定小於等於√i(i = a * b)

void prime_number(int arr)

}if (j > sqrt(i)) //修改部分}}

優化三:

我們知道,素數一定不可能是偶數(除了2),我們我們在判斷的時候,就可以直接跳過偶數,只判斷奇數

void prime_number(int arr)

}if (j > sqrt(i))}}

2.普通篩選法—— 埃拉託斯特尼篩法

要得到自然數n以內的全部素數,必須把不大於 的所有素數的倍數剔除,剩下的就是素數。

給出要篩數值的範圍n,找出以內的素數。先用2去篩,即把2留下,把2的倍數剔除掉;再用下乙個質數,也就是3篩,把3留下,把3的倍數剔除掉;接下去用下乙個質數5篩,把5留下,把5的倍數剔除掉;不斷重複下去……。

實現方法:建立兩個陣列check和arr,arr陣列用來存放素數,check是標記陣列,也就是當該數是某個素數的倍數,則標記為1,否則標記為0,

第一趟:將2標記為0,2的倍數全部標記為1

第二趟:將3標記為0,3的倍數全部標記為1

…… 最後,標記為0的即是素數

void prime_number(int arr)

;int ret = 0;

int j = 0;

for (int i = 2; i

< 10000; i++)

for (j = i + i; j

< 10000; j += i)}}

3. 線性篩選法——尤拉篩法

在上面的方法中,比如我們判斷6是不是素數,2的倍數時需要判斷一次,3的倍數時又需要判斷一次。所以尤拉篩法通過標記部分保證每個合數只會被它的最小質因數篩去。比如6只會被2的倍數篩掉。

#define max 10000

#define maxl 100000

#include

#include

void prime_number(int arr)

;int ret = 0;

int j = 0;

for (int i = 2; i < 10000; i++)

for (j = 0; j < ret; j++)//修改部分}}

求素數的幾種方法

素數,也稱為質數,其只能被1或者自身整除的自然數 不包括1 換而言之,只有兩個正因數的自然數稱為素數。與之相對的比1大但不是素數的自然數稱為合數。1和0既不是素數也不是合數,合數由若干個質數相乘得到。顯然根據定義就能判斷乙個數n是否為素數,具體的,對其從2到sqrt n 進行除法,判斷是否存在餘數為...

sql優化的幾種方法

1.盡量不要使用 select from t 用具體的字段列表代替 不要返回用不到的任何字段。2.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。3.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行...

SQL優化的幾種方法

1 盡量避免使用select 返回無用的字段會降低查詢效率。如下 select from test 優化方式 使用具體的字段代替 只返回使用到的字段。2 對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。3 盡量避免進行null值的判斷,會導致資...