一文解決如何使用 C 語(yǔ)言判斷質(zhì)數(shù)(素?cái)?shù))[ 附解析與源碼 ]
前言#
質(zhì)數(shù)歷來(lái)都是數(shù)學(xué)界的寵兒,是數(shù)學(xué)里神秘的謎團(tuán)。
質(zhì)數(shù)又和 C 語(yǔ)言有著不解之緣,本篇文章將講解如何用 C 語(yǔ)言判斷質(zhì)數(shù)。
為了方便大家在讀完此文章后使用文中程序,我會(huì)將判斷質(zhì)數(shù)的程序封裝成函數(shù),此函數(shù)的功能是:判斷形參?_number
?是否是質(zhì)數(shù),若?_number
?是質(zhì)數(shù),則返回?1
;若不是質(zhì)數(shù),則返回?0
。
何為質(zhì)數(shù)#
質(zhì)數(shù)又稱素?cái)?shù)。一個(gè)大于 1 的自然數(shù),除了 1 和它自身外,不能被其他自然數(shù)整除的數(shù)叫做質(zhì)數(shù);否則稱為合數(shù)(規(guī)定 1 既不是質(zhì)數(shù)也不是合數(shù))。
C 語(yǔ)言判斷質(zhì)數(shù)#
在了解了質(zhì)數(shù)的定義后,現(xiàn)在我們便可以著手編寫程序啦。
現(xiàn)在給定一個(gè)正整數(shù)?number
,要求我們判斷此數(shù)是否為質(zhì)數(shù)。針對(duì)這一要求本篇采用兩種判斷方法,分別是:暴力求解 與 巧用平方根。
暴力求解#
通過(guò)質(zhì)數(shù)的定義可以得到如何判斷一個(gè)數(shù)是否為質(zhì)數(shù), 我們可以通過(guò)遍歷從?2
?到?number - 1
?這個(gè)區(qū)間中的所有數(shù),如果都不能被?number
?整除,則?number
?是質(zhì)數(shù),否則?number
?不是質(zhì)數(shù)。
具體代碼如下:
/***************************************************************************** 函數(shù)名: ?Judge_PrimeNumber* 功能描述:判斷一個(gè)數(shù)是否為質(zhì)數(shù)* 輸入?yún)?shù):* _number:需要判斷的數(shù)* 返回值:* 1:是質(zhì)數(shù)* 0:不是質(zhì)數(shù)* 外部參數(shù):無(wú)* 注意事項(xiàng):無(wú)** 作者: 梁國(guó)慶* 日期: 2021-12-11* 修改記錄:****************************************************************************/int Judge_PrimeNumber(int _number){ ? ?int i = 0; ? ?if (_number < 2) ? ?{ ? ? ? ?return 0; ? /* 需要判斷的數(shù)小于 2,則不是質(zhì)數(shù),返回 0 */ ? ?} ? ?for (i = 2; i < _number; i++) ? /* 遍歷從 2 到 _number - 1 區(qū)間中的所有數(shù) */ ? ?{ ? ? ? ?if (_number % i == 0) ? ? ? ?{ ? ? ? ? ? ?return 0; ? ? ? ? ? ? ? /* 若可以被整除,則不是質(zhì)數(shù),返回 0 */ ? ? ? ?} ? ?} ? ?return 1; ? ? ? /* 若執(zhí)行完以上程序均未返回,則是指數(shù),返回 1 */}
巧用平方根#
使用暴力求解固然可以求出一個(gè)數(shù)是否為質(zhì)數(shù),但運(yùn)算次數(shù)是最多的,運(yùn)行速度也是最慢的,我們還可以將程序進(jìn)行優(yōu)化,提升程序運(yùn)行時(shí)的效率。
在一般領(lǐng)域,對(duì)正整數(shù)?number
,如果用?2
?到 $\sqrt{number}$ 之間的所有整數(shù)去除,均無(wú)法整除,則?number
?為質(zhì)數(shù)。那么就可以利用這一方法,巧用平方根判斷一個(gè)數(shù)是否為質(zhì)數(shù)。
在 C 語(yǔ)言中求平方根可以使用 C 標(biāo)準(zhǔn)庫(kù),<math.h>
?頭文件中定義了各種數(shù)學(xué)函數(shù),sqrt()
?函數(shù)是平方根函數(shù),功能是計(jì)算一個(gè)非負(fù)實(shí)數(shù)的平方根,調(diào)用時(shí)程序要包含?<math.h>
?頭文件。
具體代碼如下:
/***************************************************************************** 函數(shù)名: ?Judge_PrimeNumber* 功能描述:判斷一個(gè)數(shù)是否為質(zhì)數(shù)* 輸入?yún)?shù):* _number:需要判斷的數(shù)* 返回值:* 1:是質(zhì)數(shù)* 0:不是質(zhì)數(shù)* 外部參數(shù):無(wú)* 注意事項(xiàng):無(wú)** 作者: 梁國(guó)慶* 日期: 2021-12-11* 修改記錄:****************************************************************************/int Judge_PrimeNumber(int _number){ ? ?int i = 0; ? ?if (_number < 2) ? ?{ ? ? ? ?return 0; ? /* 需要判斷的數(shù)小于 2,則不是質(zhì)數(shù),返回 0 */ ? ?} ? ?for (i = 2; i <= sqrt(_number); i++) ? ?/* 遍歷從 2 到 √_number 區(qū)間中的所有數(shù) */ ? ?{ ? ? ? ?if (_number % i == 0) ? ? ? ?{ ? ? ? ? ? ?return 0; ? ? ? ? ? ? ? ? ? ? ? /* 若可以被整除,則不是質(zhì)數(shù),返回 0 */ ? ? ? ?} ? ?} ? ?return 1; ? ? ? /* 若執(zhí)行完以上程序均未返回,則是指數(shù),返回 1 */}
如何調(diào)用函數(shù)#
對(duì)于如何使用 C 語(yǔ)言判斷質(zhì)數(shù),共講解了兩種方法并分別將編寫的程序封裝成為函數(shù),現(xiàn)在我們來(lái)講解一下如何在實(shí)際應(yīng)用中調(diào)用它們。
在這里,我以巧用平方根為例進(jìn)行講解(暴力求解的調(diào)用方法與之相同),也特別推薦大家在以后的使用中優(yōu)先選擇巧用平方根這種方法,因?yàn)橥ㄟ^(guò)平方根進(jìn)行判斷是運(yùn)算次數(shù)最少的,可以極大的提高我們程序的效率。
樣例代碼中,我們輸入一個(gè)整數(shù),然后調(diào)用判斷質(zhì)數(shù)的函數(shù),若輸入的數(shù)是質(zhì)數(shù)則輸出?Yes
,否則輸出?No
。
具體代碼如下:
/***************************************************************************** 函數(shù)名: ?Judge_PrimeNumber* 功能描述:判斷一個(gè)數(shù)是否為質(zhì)數(shù)* 輸入?yún)?shù):* _number:需要判斷的數(shù)* 返回值:* 1:是質(zhì)數(shù)* 0:不是質(zhì)數(shù)* 外部參數(shù):無(wú)* 注意事項(xiàng):無(wú)** 作者: 梁國(guó)慶* 日期: 2021-12-11* 修改記錄:****************************************************************************/int Judge_PrimeNumber(int _number){ ? ?int i = 0; ? ?if (_number < 2) ? ?{ ? ? ? ?return 0; ? /* 需要判斷的數(shù)小于 2,則不是質(zhì)數(shù),返回 0 */ ? ?} ? ?for (i = 2; i <= sqrt(_number); i++) ? ?/* 遍歷從 2 到 √_number 區(qū)間中的所有數(shù) */ ? ?{ ? ? ? ?if (_number % i == 0) ? ? ? ?{ ? ? ? ? ? ?return 0; ? ? ? ? ? ? ? ? ? ? ? /* 若可以被整除,則不是質(zhì)數(shù),返回 0 */ ? ? ? ?} ? ?} ? ?return 1; ? ? ? /* 若執(zhí)行完以上程序均未返回,則是指數(shù),返回 1 */}int main(){ ? ?int N = 0; ? ?scanf("%d", &N); ? ?if (Judge_PrimeNumber(N) == 1) ?/* 調(diào)用判斷質(zhì)數(shù)的函數(shù),判斷輸入的整數(shù) N */ ? ?{ ? ? ? ?printf("Yes\n"); ? ? ? ? ? ?/* 是質(zhì)數(shù),則輸出 Yes */ ? ?} ? ?else ? ?{ ? ? ? ?printf("No\n"); ? ? ? ? ? ? /* 否則輸出 No */ ? ?} ? ?return 0;}
后記#
至此,我們講解了關(guān)于質(zhì)數(shù)的定義,帶領(lǐng)大家編寫了 C 語(yǔ)言判斷質(zhì)數(shù)的程序代碼,并將所寫代碼封裝成為函數(shù),同時(shí)為大家演示了如何調(diào)用函數(shù)來(lái)判斷質(zhì)數(shù)。
相信看完本篇文章的你,以后再遇到 C 語(yǔ)言判斷質(zhì)數(shù)的問(wèn)題,可以解決的游刃有余。
作者:main工作室