osc裏貼代碼時貌似不全,並且沒人看,之後還不發了吧
html
今天在學習C語言時遇到一個題目,要求程序知足:用戶輸入任何一個整數,程序判斷其是否爲質數,而後輸出判斷的結果。學習
看到這個要求,我頭腦中首先閃過的是:什麼是素數?而後纔想到素數是隻能被1和其自己整除的數,而後我就根據這個定義寫最原始的代碼。測試
/* Function:判斷一個數是否爲質數 Author:Shura */ #include<stdio.h> int main(){ int k=0,input=0; scanf("%d",&input); for(int i=1;i<=input;i++){//從1開始除,一直到輸入的數自己 if(input%i==0){ k++; } } if(k==2){//若是隻被1和該數自己除 printf("這是質數\n"); } else { printf("這不是質數\n"); } return 0; }
而後我就開始測試,發現隨便輸入幾個數字都能正確判斷出來,可是 當我輸入負數時,發現居然都提示不是質數,因而我就去百度了一下,原來質數必須是大於1的整數,而個人程序卻沒有限制,因此bug就誕生了,修復方法很簡 單,對於輸入的值加個判斷便可,而且我還發現:既然每次都要除1和它自己,那麼若是直接跳過1和它自己,程序的效率應該會獲得提升,因而把代碼修改了一 下。優化
/* Function:判斷一個數是否爲質數 Author:Shura */ #includeint main(){ int k=0,input=0; scanf("%d",&input); for(int i=1;i<=input;i++){//從1開始除,一直到輸入的數自己 if(input%i==0){ k++; } } if(k==2){//若是隻被1和該數自己除 printf("這是質數\n"); } else { printf("這不是質數\n"); } return 0; }
而後我繼續測試,發現數字達到千萬級時程序開始變得有點卡了,而 到億級時,程序的判斷時間就更長了,我就開始考慮怎麼優化,而後想到:既然質數的定義規定了只能被1和自己整除,那麼若是它被其餘的數除過一次了,應該就 能夠直接判斷這不是質數,直接跳出循環了。最後的完成品誕生了,固然還有點小問題,由於不一樣CPU int的上限不一樣,只能簡單的設置不能超過十億spa
/* Function:判斷一個數是否爲質數 Author:Shura */ #includeint main(){ int k=2,input=0; scanf("%d",&input); if(input999999999){ printf("輸入的數有誤,請從新輸入\n"); return 1; } for(int i=2;i<input;i++){//直接從2開始除,一直除到輸入的數(不包括自己) if(input%i==0){ k++; } } if(k==2){//若是隻被1和該數自己除,那麼k應該不變仍是2 printf("這是質數\n"); } else { printf("這不是質數\n"); } return 0; }
我確實比較無聊,糾結於這些不重要的細節,可是我想從一開始就培養一種細心的習慣,由於細心過重要了,經過3年的高中生涯,讓我知道的馬虎害死人,但願我能在若干年後,再看這篇文章時,我能感謝本身從當時開始培養起一種細心的習慣吧!.net
原文發表在個人博客裏:http://chenxuefeng.net.cn/2014/06/2693.htmlcode