看過《最強大腦》的小夥伴應該都知道珠心算。尤其是在中國隊對陣日本隊時,那種緊張的氣氛婉如世紀大戰一觸即發。對於大多數和我一樣的普通小老百姓而言就只剩下感嘆的份了。
所謂的珠心算其實就是「珠算」和「心算」的結合體。乙個龐大的數字在瞬間就能分辨是否是質數,這種計算量要是讓我來,怎麼也得廢上好幾本筆記本了。在電影《異次元殺陣》中也用到了質數判斷來作為阻攔主角一行人的難題,沒看過的可以去補補哦。
那麼作為乙個碼農我今天要講解的是如何使用**來瞬間完成大數字的質數判斷。**部分其實很簡單,如果沒興趣了解原理的話直接跳到最後看**就可以了。
一、什麼是質數
質數就是只能被1和本身除盡的數。
根據這個特點可以把這個數(n)依次除以2 ~ (n-1)。這樣就可以判斷數字n是否是質數。但是這種辦法顯得異常的蠢,它的時間複雜度為o(n)。
二、列舉偶數質數
在偶數當中只有2符合質數的特點,所以偶數中也只有乙個質數2。
根據這個特點可以在上述方法上進行改進,在依次除以2 ~ (n-1)之前加上乙個非偶數判斷就能減少一半的工作量。
三、最小偶質數和最小奇質數的最小公約數
最小偶質數2,最小奇質數3(質數的取值範圍是大於1的自然數,因此1不能作為最小奇質數)。2和3的最小公約數(它是乙個能被若干個整數同時均整除的整數。如果乙個整數同時是幾個整數的約數,稱這個整數為它們的公約數)為6。
根據這個特點可以把跨度定為6。因為在6x中只有(6x-1)和(6x+1)會出現質數,別的數都能夠被2或3整除。這樣一來在2 ~ (n-1)之間又篩出了三分之一的奇數。
先來乙個假設,如果乙個數不為質數且有5、7、35等因數。那麼在進行除法操作時只需要除到5便可以判斷出該數不是乙個質數。由此可見最複雜的情況便是該數除去1和本身之外只有乙個因數(乙個質數的平方),例如49。
根據這個特點可以把乙個數開根,只需要除到開根數如果沒有被整除便是質數,被整除便不是質數。
結合以上所有特點得到下面質數判斷演算法:
public boolean demo(int num)
if(num %6!= 1&&num %6!= 5)
int tmp =(int)math.sqrt(num);
for(int i= 5;i <=tmp; i+=6 )
} return true ;
}
我的生命因為有你
寫下這些,希望你能看到。每個人的生活都是獨一無二的體驗,或者是充滿神奇冒險,或者又是枯燥無味,這些都是你所經歷的特殊。很早以前的時候,我希望自己成為一名心理醫生,可以給別人講道理,說服他,讓他明白我所謂常人的價值觀念,我們應該怎麼樣,不應該怎麼樣,我們應該做些什麼,不應該去做什麼。就像大人給小孩子說...
我有酒,你有故事嗎
作序 鼓起勇氣,終於開始了我新的文集創作,這個文集就叫 我有酒,你有故事嗎 也就是在學校請同學吃個飯,聊個天,說出故事,由我來記錄發表。由於是第一次,找了班上的l同學開刀,聽聽他的故事。人生磕磕絆絆,堅定走下去 初識l同學,是不見其身,先聞其名的。剛考上研就知道l同學,說 寫的好,很厲害的乙個學生。...
我有酒,你有故事嗎?
記錄學習的每一秒,巨杉技術社群有獎徵文全新啟動!如果,你熱愛資料技術,樂於嘗 zhe 試 teng 又喜歡寫點什麼 那麼,無論你是架構大佬,還是dba大神,只要你願意通過文字分享你的知識與經驗,就快來加入我們的 有獎徵稿 活動吧 各類專屬特權保證讓你拿到手軟!巨杉技術社群等你來 約 在這裡,你將獲得...