判斷一個整數是否爲質數淺談

osc裏貼代碼時貌似不全,並且沒人看,之後還不發了吧
html

Shura

        今天在學習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

相關文章
相關標籤/搜索