C語言 輸出指定個數的質數

2021-09-12 10:38:41 字數 3537 閱讀 4193

只能被1和自身整除的對於1正整數。

2, 3, 5, 7, ...

unsigned long long *pprimes = null;

null對指標而言相當於0值,在宣告指標的時候最好將其初始化為null防止其亂指,在後面使用過程中

造成記憶體覆蓋等問題。

宣告需要的變數:

// 用來儲存所有的質數

unsigned

long

long

*pprimes =

null

;unsigned

long

long trial =0;

_bool found = false;

int total =0;

// 需要輸出的總質數個數

int count =0;

// 用來計數

pprimes指標用來存放動態分配的記憶體首位址。

trial用來獲得當前將要被處理的可能是質數的數。

total使用者需要展示的質數的個數,由使用者輸入。

count迴圈的計數。

malloc()calloc()區別在於calloc()有兩大有點:

將記憶體分配為給定大小的陣列;

會將所有分配的記憶體初始化為0

因此盡量使用calloc去動態分配記憶體。

這裡我們固定記憶體的容量大小為:size_t capacity = 10;使用size_t是因為

calloc()malloc()的第二個引數型別為size_t型別。

printf

("請問想要輸出多少個質數(至少4個) ? ");

scanf

("%d"

,&total)

;// 根據輸入個數分配空間

// 固定初次分配的記憶體量

size_t capacity =10;

pprimes =

(unsigned

long

long*)

calloc

(capacity,

sizeof

(unsigned

long

long))

;if(!pprimes)

記得分配完內存在使用之前,一定要做非空判斷,判斷是否分配成功,只有成功了才能繼續往下,否則可能會造成未知的嚴重後果。

根據質數的特性,我們先宣告幾個已知的質數(2, 3, 5),然後根據這些已知的質數,去被將來的質數整除,只要能整除,說明

它不是質數。

// 直接找出前 3 個質數 (2, 3, 5)

*pprimes =

2ull;*

(pprimes +1)

=3ull;*

(pprimes +2)

=5ull

;count =3;

trial =

5ull

;

unsigned

long

long

*ptemp =

null

;while

(count < total)

if(found)

}

trail += 2ull;這裡使用了個技巧,因為我們知道除了2意外的偶數(>0)都不會是質數,因此偶數就沒必要

去做多餘的判斷了。

*(pprimes + count++) = trial;

並將它放到最後乙個質數的後面通過*(pprimes + count++),因為指標的+1是根據其指標存放的資料型別

的大小遞增的,因此可以直接通過指標+count來找到要存放當前質數的位址。

但前提是最後乙個質數空間後面有更多的空間去容納它,那麼這個時候就需要考慮去動態分配更多的空間了,

因為我們最初只固定分配了cap_incr個記憶體空間。

realloc()會在malloc()calloc()基礎之上分配更多的記憶體空間,並且會將舊的記憶體拷貝到新的記憶體中。

比如:malloc()5個記憶體空間:12

345然後通過realloc()分配10個記憶體空間:00

0000

0000

然後會把malloc()分配的記憶體裡的內容拷貝到新的裡面成為:12

3450

0000

// 是否找到 ??

if(found)

pprimes = ptemp;

}// 將找到的質數儲存起來

*(pprimes + count++

)= trial;

}

上面宣告了乙個新的指標ptemp用來指向再分配的記憶體空間,但是會發現我們後面並沒有去針對這個指標去做釋放操作,

這是因為我們後面將pprimes指向了ptemp,而我們也在後面對pprimes進行了釋放。

即如果兩個指標同時指向乙個記憶體空間的話,只需要釋放乙個就可以了,如果兩個都去呼叫free()進行釋放,

其實就是意味著對同一塊記憶體進行兩次釋放,這個也可能會造成不可預知的問題,因此切記不要對同一塊記憶體進行兩次甚至

更多次的釋放操作。

// 輸出得到的質數

for(

int i =

0; i < total; i++)}

printf

("\n");

// 釋放記憶體

free

(pprimes)

;// 置空指標

pprimes =

null

;

分配記憶體之後,不用的時候不單單要呼叫free()去釋放,釋放之後,這個指標也需要置空處理,防止亂指。

該例項完成,主要是認識malloc(),calloc()realloc()動態分配記憶體以及記憶體釋放函式的使用,及其相關的一些知識和注意點和質數的概念。

輸出指定範圍內的所有質數

以上程式輸出所有不大於999的質數,產生格式化輸出。程式採用篩選的思想對指定範圍內的所有正整數進行排除,最後得以 倖存 的全部都為質數。該演算法思想詳見維基百科sieve of eratosthenes相關條目。需要注意的是以上c 實現中的外層迴圈只用進行到sqrt upper 證明如下 假設存在乙...

Python輸出指定數以內的質數

本次我們不需要準備任何庫!實現效果如下 步驟 1.開啟開發工具,新建乙個空白python檔案。2.輸入 建立prime函式,裡面有乙個引數maxnumber defprime maxnumber 建立所需變數 list min 2 巢狀迴圈 while min maxnumber 建立新開關 is ...

17 質數的輸出

質數,在我之前的c語言課上就已經學過了,今天的題目與他有關 總結一下意思 你輸入乙個數,記作l 接著需要你從2開始將質數給累加起來,這個累加的和不得超過l,就是說不能有越界的操作 然後,將得到的所有質數挨個輸出,並且輸出質數的個數,得到結果。其中判斷是否為質數就是乙個需要高精的演算法了,不然又過不了...