C語(yǔ)言輸入一個(gè)數(shù)判斷是否為素?cái)?shù)的多種方法
需要解決這個(gè)問(wèn)題,首先我們要明白-------->什么是素?cái)?shù)?
(質(zhì)數(shù))素?cái)?shù)是指在大于1的自然數(shù)中,除了1和它本身以外不再有其他因數(shù)的自然數(shù)。
舉個(gè)例子:4 可以 由2*2=4 和1*4 得到,不符合素?cái)?shù)的條件,所以不是素?cái)?shù)。
5 只能由1*5 得到,符合素?cái)?shù)的條件,所以是素?cái)?shù)。
好了現(xiàn)在,我們了解了素?cái)?shù)的概念,我們就把它轉(zhuǎn)化成代碼的思想,進(jìn)行我們的操作了。
1. 第一種方法
這種方法的思想也是最直接最普遍的,假設(shè)這個(gè)數(shù)是n,我們需要判斷素?cái)?shù),我們就拿這個(gè)數(shù)和從(2~~n-1)的每個(gè)數(shù)去和這個(gè)數(shù)做取余操作,如果有一個(gè)數(shù)可以使得余數(shù)為0,則這個(gè)數(shù)不是素?cái)?shù),反之則這個(gè)數(shù)為素?cái)?shù)。
好了接下來(lái)我們用代碼實(shí)現(xiàn)
#include <stdio.h> int main() { int i=0; int j=0; printf("輸入一個(gè)數(shù) "); scanf("%d",&j); for(i=2;i<j;i++) { if(j%i==0) { printf("%d 不是素?cái)?shù)",j); break; } } if(j==i) { printf("%d 是素?cái)?shù)",j); } if(j==1) { printf("%d 不是素?cái)?shù)",j); } return 0; }
代碼的具體實(shí)現(xiàn)就在上面,可能有的同學(xué)對(duì)if語(yǔ)句中為什么當(dāng)j==i時(shí),就輸出是素?cái)?shù)。
不要著急,我給大家捋捋思路,我們可以思考一下,如果在(2~~j-1)中的每一個(gè)數(shù)都沒(méi)滿足取余操作后余數(shù)為0,那這時(shí)我的 i 應(yīng)該 等于j-1,但我們的 i 由于滿足i<j還會(huì)繼續(xù)進(jìn)行++操作,然后我的 i 就等于j ,此時(shí)已經(jīng)不滿足i <j 的條件,我們就會(huì)跳出for循環(huán),此時(shí)我們就可以認(rèn)為,當(dāng) i==j時(shí),這個(gè)數(shù)為素?cái)?shù)。
2.第二種方法
我們對(duì)第一種方法進(jìn)行優(yōu)化,我們通過(guò)下述例子分析可知,每個(gè)數(shù)的因數(shù)中,其中一個(gè)不會(huì)超過(guò)本身的1/2,所以我們可以利用這個(gè)思想對(duì)代碼進(jìn)行優(yōu)化。
我們其實(shí)并不需要對(duì)(2~~n-1)的全部數(shù)進(jìn)行上述操作,我們可以只對(duì)(2~~n/2)的全部數(shù)進(jìn)行上面的操作就可以了,這樣可以簡(jiǎn)化我們的計(jì)算范圍。
舉個(gè)例子:4 可以 由2*2=4 和1*4 得到,因數(shù) 2,2或1,4,每組其中的一個(gè)因數(shù)不大于自身(4)的1/2。
好了接下來(lái)我們用代碼實(shí)現(xiàn)
#include <stdio.h> int main() { int i=0; int j=0; printf("輸入一個(gè)數(shù) "); scanf("%d",&j); for(i=2;i<=j/2;i++) { if(j%i==0) { printf("%d 不是素?cái)?shù)",j); break; } } if(j==1) { printf("%d 不是素?cái)?shù)",j); } if((i>j/2) && (j!=1)) { printf("%d 是素?cái)?shù)",j); } return 0; }
大家覺(jué)得還能對(duì)代碼思想進(jìn)行優(yōu)化嗎?????
答案是肯定的!
3.第三種方法
我們對(duì)第二種方法進(jìn)行優(yōu)化,我們通過(guò)下述例子分析可知,每個(gè)數(shù)的因數(shù)中,其中一個(gè)不會(huì)超過(guò)本身的開(kāi)方,這樣我們又縮小了我們的計(jì)算范圍,所以我們可以利用這個(gè)思想再次對(duì)代碼進(jìn)行優(yōu)化。
舉個(gè)例子:16 可以 由1*16,2*8和4*4,得到,因數(shù)1,16和2,8和4,4每組其中的一個(gè)因數(shù)不大于本身(16)的開(kāi)方(4)。
好了接下來(lái)我們用代碼實(shí)現(xiàn)
#include <stdio.h> #include<math.h> int main() { int i=0; int j=0; printf("輸入一個(gè)數(shù) "); scanf("%d",&j); for(i=2;i<=sqrt(j);i++) { if(j%i==0) { printf("%d 不是素?cái)?shù)",j); break; } } if(j==1) { printf("%d 不是素?cái)?shù)",j); } if((i>sqrt(j)) && (j!=1)) { printf("%d 是素?cái)?shù)",j); } return 0; }
因?yàn)橛玫搅藬?shù)學(xué)中開(kāi)平方的函數(shù),所以引用了多一個(gè)庫(kù),這個(gè)不做過(guò)多講解,大家自行去了解。
當(dāng)然判斷素?cái)?shù)不知有上述的方法,還可以通過(guò)函數(shù)進(jìn)行實(shí)現(xiàn)。
4.第四種方法(函數(shù)實(shí)現(xiàn))
具體的代碼思想和第一種方法一樣,不再講解。
好了接下來(lái)我們用代碼實(shí)現(xiàn)
#include <stdio.h> int judge(int n) { int i=0; for(i=2;i<n;i++) { if(n%i==0) return 0; } if(n==1) { return 0; } return 1; } int main() { int j=0; printf("輸入一個(gè)數(shù)"); scanf("%d",&j); if(judge(j)==1) printf("%d 是素?cái)?shù)",j); else printf("%d 不是素?cái)?shù)",j); return 0; }
這種思想和第一種一樣,所以也可以像第二,三種那樣對(duì)代碼進(jìn)行優(yōu)化,這里就不過(guò)多講解了(累了累了嘞????)
遇到的問(wèn)題:我思考了好久,在糾結(jié)當(dāng)輸入1的時(shí)候的這種情況應(yīng)該怎么去調(diào)整代碼,大家能看到我每塊代碼都用了If語(yǔ)句對(duì)是不是1進(jìn)行了判斷,(能力有限????)所以我能想到的方法就是通過(guò) if 語(yǔ)句對(duì)輸入的1進(jìn)行判斷,如果不用這個(gè)if語(yǔ)句,那輸入1 的時(shí)候結(jié)果可能就有問(wèn)題,但我覺(jué)得這樣會(huì)不會(huì)太麻煩了,但我又想不出來(lái)怎么去調(diào)整。
總結(jié)
到此這篇關(guān)于C語(yǔ)言輸入一個(gè)數(shù)判斷是否為素?cái)?shù)的多種方法的文章就介紹到這了,更多相關(guān)C語(yǔ)言判斷是否為素?cái)?shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言自定義實(shí)現(xiàn)strlen函數(shù)的3種方法總結(jié)
這篇文章帶大家了解C語(yǔ)言中自定義實(shí)現(xiàn)strlen函數(shù)的3種方法,計(jì)數(shù)器,遞歸以及指針,這三種方法通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08深度解析三個(gè)常見(jiàn)的C語(yǔ)言內(nèi)存函數(shù)
這篇文章主要深度解析了三個(gè)常見(jiàn)的C語(yǔ)言內(nèi)存函數(shù)memcpy,memmove,memcmp,所以本文將對(duì)memcpy,memmove,memcmp 三個(gè)函數(shù)進(jìn)行詳解和模擬實(shí)現(xiàn),需要的朋友可以參考下2023-07-07C++讀取NC數(shù)據(jù)的結(jié)果與真實(shí)數(shù)值不一致的解決方法
本文介紹基于C++ 語(yǔ)言的netCDF庫(kù)讀取.nc格式的柵格文件時(shí),代碼讀取到的數(shù)據(jù)與柵格文件的實(shí)際數(shù)據(jù)不一致的解決方法,文中通過(guò)代碼示例和圖文講解的非常詳細(xì),需要的朋友可以參考下2024-03-03常用的C++標(biāo)準(zhǔn)庫(kù)頭文件小結(jié)
C++標(biāo)準(zhǔn)庫(kù)定義了一系列函數(shù)、宏和對(duì)象,以實(shí)現(xiàn)跨團(tuán)隊(duì)、跨平臺(tái)的高效且具有卓越性能的標(biāo)準(zhǔn)化 C++ 代碼, 本文介紹常用的C++標(biāo)準(zhǔn)庫(kù)頭文件,需要的朋友可以參考下2023-11-11簡(jiǎn)單說(shuō)說(shuō)STL的內(nèi)存管理
<STL 源碼剖析>將其描述為空間配置器,理由是allocator可以將其它存儲(chǔ)介質(zhì)(例如硬盤)做為stl 容器的存儲(chǔ)空間。由于內(nèi)存是allocator管理的主要部分,因此,本文以STL內(nèi)存管理為出發(fā)點(diǎn)介紹allocator2013-09-09C語(yǔ)言實(shí)現(xiàn)xml構(gòu)造解析器
本文給大家分享的是使用C語(yǔ)言來(lái)實(shí)現(xiàn)xml構(gòu)造解析器的方法和代碼,簡(jiǎn)單易用,推薦給大家2016-07-07C++ OpenCV實(shí)戰(zhàn)之網(wǎng)孔檢測(cè)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用C++和OpenCV實(shí)現(xiàn)網(wǎng)孔檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-05-05C++?sqlite3數(shù)據(jù)庫(kù)配置使用教程
SQLite 是一種嵌入式的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它是一個(gè)開(kāi)源項(xiàng)目,已經(jīng)被廣泛應(yīng)用于各種應(yīng)用程序和操作系統(tǒng)中,這篇文章主要介紹了C++?sqlite3數(shù)據(jù)庫(kù)配置使用,需要的朋友可以參考下2023-08-08