1. 程式人生 > >對於C#中遇到質數問題的一點思考

對於C#中遇到質數問題的一點思考

bool變量 進行 因數 TE 排除 簡單 數據 就是 div

對於入門級程序猿(工程獅)來說,無論是自己摸索還是在老師引導下,第一次遇到跟篩選質數相關的一系列問題,總會有點頭大。薩摩本人於此深有體會,無論是作為高中數學題的編程應用還是大學公共計算機課程初涉C語言亦或是現在正在學習的C#,也無論之前的一些簡單問題處理得多麽行雲流水,質數都要來個下馬威,讓人卡機,認識到程序世界殘酷的真相(不排除個人智力因素...)~

對於判斷質數,老師傳授了一種思路,即定義一個bool變量,初始化true,然後對數據進行循環判斷。因為質數只能被1和它本身整除,所以在循環體中,定義一個初始值為2,不斷自增到數據本身減1的變量,然後讓數據重復求余該變量。一旦求余為0即代表數據可以整除除1和自身外的某一個數,則該數就不是質數,bool變量可賦值為true,終止循環。反之,進行下一循環,若循環到自身減1都未找到可以整除的除數,則代表該數就是質數,終止循環。最後對bool變量進行判斷,即可的到結論。

代碼舉例:

int num=int.Parse(Console.ReadLine());

bool isFind=true;

for(int i=2;i<=num-1;i++)

{

if(num%i==0)

{

isFind=false;

break;

}

}

if(isFind)

{

Console.WriteLine(num+"是質數");

}

else

{

Console.WriteLine(num+"不是質數");

}

Console.ReadLine();

通過這樣的代碼實現,能夠基本實現對任何一個用戶輸入的正整數進行是否是質數的判斷。但是,作為在數學上就必須註意的一點——1是否是質數,這段代碼並不能進行正確的判斷。眾所周知(說是這樣說,薩摩反正是百度了),1並不是質數,雖然它滿足其只能被1和自身整除的條件,但因為1和自身都是1,其因數事實上只有1個。在數學史上,曾經將1視為質數,但後來明確定義了,(正)因數個數為2的正整數才是質數,此時1因為只有1個因數,就脫離了質數的隊伍,當然也進不了合數的行列。因此按照這個定義的概念,判斷質數的代碼有了新的思路,即讓某數據從1開始取余直到自身,因為任何一個數都可以被1和自身整除,所以除1以外,所有數的因數至少為2個,而一旦某數因數多於2,則可以斷定其為合數。故可定義一個計數變量用於統計某數的因數個數,每有1個因數該計數變量自增1,在循環結束後對於計數變量進行判斷,若其為2,則該數為質數,反之無論大於2還是小於2均不是質數。

代碼舉例:

int num=int.Parse(Console.ReadLine());

int times=0;

for(int i=1;i<=num;i++)

{

if(num%i==0)

{

times++;

continue;

}

}

if(times==2)

{

Console.WriteLine(num+"是質數");

}

else

{

Console.WriteLine(num+"不是質數");

}

Console.ReadLine();

以上,就是思考後的代碼實現,可以對1進行正確的判斷,當然,既然1不是質數也不是合數的定義已經深入人心,完全可以在一開始就對用戶輸入的數字進行判斷,如果是1,則可直接輸出結果,這裏也只是針對這個問題稍加贅述。

最後,需要說明的是,這只是入門級的小問題,映射出的是對於問題進行多層次思考的必要性,相信隨著不斷學習,還有更多更好更全面更簡單的編程思想可以參考,作為初學者,薩摩表示很期待!

對於C#中遇到質數問題的一點思考