只能被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,就是說不能有越界的操作 然後,將得到的所有質數挨個輸出,並且輸出質數的個數,得到結果。其中判斷是否為質數就是乙個需要高精的演算法了,不然又過不了...