C語言求質數的方法

2021-07-05 20:02:52 字數 1758 閱讀 8332

質數就是只能被1和本身整除的數。eratosthenes篩選法是一種計算質數的有效方法。這個演算法的第一步就是寫下所有從2至某個上限之間的所有整數。在演算法的剩餘部分,遍歷整個列表並剔除所有不是質數的整數。後面的步驟是這樣的。找到列表中的第1個不被剔除的數(也就是2),然後將列表後面所有逢雙的數都剔除,因為它們都可以被2整除,因此不是質數。接著,再回到列表的頭部重新開始,此時列表中第乙個尚未被剔除的第1個數是3,所以在3之後把每逢第3個數(3的倍數)剔除。完成這一步之後,再回到列表開頭,3後面的下乙個數是4,但它是2的倍數,已經剔除,所以將其跳過,輪到5,將所有5的倍數剔除,這樣依次類推、反覆進行,最後列表中未被剔除的數均為質數。

編寫乙個程式,實現這個演算法,使用陣列表示列表。每個陣列元素的值用於標記對應的數是否已被剔除。開始時陣列所有元素的值都設定為true,當演算法要求「剔除」其對應的數時,就把這個元素設定為false。如果你的程式執行於16位的機器上,小心考慮是不是把某個變數宣告為long。一開始先使用包含1000個元素的陣列。如果你使用字元陣列,使用相同的空間,你將會比使用整數陣列找到更多的質數。你可以使用下標來表示指向陣列首元素和尾元素的指標,但你應該使用指標來訪問陣列元素。

除了2之外,所有的偶數都不是質數。陣列中的元素只對應奇數可以使程式的空間效率大為提高。

#include 

#include

#define size 10

#define true 1

#define false 0

int main()

printf( "%5d", 2);

for( number = 3, sp = &sieve[ 0 ]; sp < &sieve[ size ]; number += 2, sp++)

}if (j % 10 != 0)

putchar ('\n');

return exit_success;

}

為了更加的節省空間可以使用位陣列,但使用位陣列不具有移植性,且會降低時間效率。

#include 

#include

#include

#define size 10

#define true 1

#define false 0

unsigned character_offset (unsigned bit_number);

unsigned bit_offset (unsigned bit_number);

int main()

; char *p = str;

int i = 0;

int j = 1;

int number = 3;

int m;

for (i = 0; i < size * char_bit; i++) //將位陣列中的位全部置為true

for (i = 0, number = 3; ; number += 2, i++)

printf ("%6d", 2);

for (i = 0, number = 3; i < size * char_bit; i++, number += 2)

}if (j % 10 != 0)

putchar('\n');

return0;}

unsigned character_offset (unsigned bit_number)

unsigned bit_offset (unsigned bit_number)

求質數 素數 的方法

質數是數學重要的一環,所謂質數,就是除了1和它本身外不存在任何因子的數。以下整理了一下c語言中質數的求法。問題 輸入乙個正整數n n 2 求不大於n的全部質數 方法一 迴圈法 思路 判斷乙個數n是不是質數,可以用2到 n之間的所有整數去除n,如果都不能整除,那麼n是質數。設計迴圈巢狀時盡量跳過一些不...

求質數的其他方法

如果要求輸出1 n之間的所有質數,需要注意如下幾個方面 1 2是質數,單獨輸出 2 只需測試奇數是否是質數 3 如何判斷某個數x是否是質數,有如下幾種方法 i.測試x是否能被3 x 2的數整除,若沒有能整除的,則為質數,否則不是質數 ii.測試x是否能被3 sqrt x 之間的數整除,若沒有能整除的...

《質數》判斷質數(較快的方法C )

to be honest,我感覺我也刷了1,200道題了,真是有的題刷了一次又一次,但是還是存在會的還是會,不會的還是不會。因而我就思考是不是我的做題模式出現了問題。下面展示一下我之前的做題風格,哎,還是走高三的老路,就是刷題,不總結,不分類,只追求數量。為了改善這種情況,我決定做好總結與分類,以求...