① java中怎麼求素數
首先樓主應該對素數的定義已經清楚了吧?其實就是一個數,如果存在1和它本身以外,有數能整除它,這個數就不是素數.
在這里,有2個關鍵的變數,我估計解釋一下你就能看得明白這個演算法了.
1.關於變數k.變數k的作用是優化整個演算法,因為比如要判斷一個數13是不是素數,我們沒必要從2循環到13.只要循環到對13開根號.13開根號大概是3.6多,強轉為int類型後是3.也就是說只要檢查2,3是否能整除13.如果不能,13肯定是一個素數.因為比如48這個數,你前面檢測到被4整除等於12,那麼繼續循環超過Math.sqrt(48)的話,無非就是得到一個反過來的被12除等於4的結果.這個沒有必要.
2.關於變數j.注意點1:j是在最外層的循環體中定義的.這個時候剛定義完,j的值是初始的0.然後j從2開始,一直到小於等於k結束.這里是控制嘗試整除的循環次數.一旦發現在這個范圍內有數能整除i,那麼就跳出循環.
所以,對於你不理解的那個部分,首先確定一點,程序只要執行到break,就說明這個數是素數.
例如我們這次k = 10,那麼是要從j = 2到10逐一檢測 i 是不是能被 j 整除.當j = 7的時候比如可以整除了,就跳出當前內層循環了.這時候, j 顯然是不大於 k 的,因為只要是中途跳出,因為內層循環(j = 2; j <= k; j++)的控制,只要在循環過程中跳出來的,那麼j 肯定 <= k.
只有循環到j = 10依然沒有break的話,根據for循環的執行順序,會執行j++,然後去判斷j <= k 是否為true,為true則繼續下一次循環,否則循環結束.而在這里,如果到10還沒有能夠整除的話,j是會在10的基礎上自增的.這時候j就=11了.
那麼if ( j > k )就不成立了,則i 不會被輸出.
總結一點:就是如果中途or最後一次循環,找到能整除的數了,那麼因為break的關系,最後就不會執行 j++, 所以j <= k的條件是能保證的. 換言之,如果j > k (亦即j <= k 的取反)表示沒有找到能整除的數.其實j最大也就只能等於k+1.
另外,,你也可以自己修改修改,來加深理解.例如
boolean isPrime; //定義布爾變數判斷是否素數.是:true;否:false
for (int i = 3; i <= 100; i++) {
isPrime = true;
int k = (int) Math.sqrt(i);
for (int j = 2; j <= k; j++) {
if (i % j == 0) {
isPrime = false; //如果能夠有數整除i,那麼就不是素數.
break;
}
}
if (isPrime) {
System.out.println(i);
}
}
這樣就沒有必要在外層循環里就定義j這個變數了.如果我上面說的你理解還是比較困難,可以先理解用布爾變數來控制的寫法.這個理解了,用j > k 判斷的就也很容易理解了.
② java求素數
首先樓主應該對素數的定義已經清楚了吧?其實就是一個數,如果存在1和它本身以外,有數能整除它,這個數就不是素數.
在這里,有2個關鍵的變數,我估計解釋一下你就能看得明白這個演算法了.
1.關於變數k.變數k的作用是優化整個演算法,因為比如要判斷一個數13是不是素數,我們沒必要從2循環到13.只要循環到對13開根號.13開根號大概是3.6多,強轉為int類型後是3.也就是說只要檢查2,3是否能整除13.如果不能,13肯定是一個素數.因為比如48這個數,你前面檢測到被4整除等於12,那麼繼續循環超過Math.sqrt(48)的話,無非就是得到一個反過來的被12除等於4的結果.這個沒有必要.
2.關於變數j.注意點1:j是在最外層的循環體中定義的.這個時候剛定義完,j的值是初始的0.然後j從2開始,一直到小於等於k結束.這里是控制嘗試整除的循環次數.一旦發現在這個范圍內有數能整除i,那麼就跳出循環.
所以,對於你不理解的那個部分,首先確定一點,程序只要執行到break,就說明這個數是素數.
例如我們這次k = 10,那麼是要從j = 2到10逐一檢測 i 是不是能被 j 整除.當j = 7的時候比如可以整除了,就跳出當前內層循環了.這時候, j 顯然是不大於 k 的,因為只要是中途跳出,因為內層循環(j = 2; j <= k; j++)的控制,只要在循環過程中跳出來的,那麼j 肯定 <= k.
只有循環到j = 10依然沒有break的話,根據for循環的執行順序,會執行j++,然後去判斷j <= k 是否為true,為true則繼續下一次循環,否則循環結束.而在這里,如果到10還沒有能夠整除的話,j是會在10的基礎上自增的.這時候j就=11了.
那麼if ( j > k )就不成立了,則i 不會被輸出.
總結一點:就是如果中途or最後一次循環,找到能整除的數了,那麼因為break的關系,最後就不會執行 j++, 所以j k (亦即j <= k 的取反)表示沒有找到能整除的數.其實j最大也就只能等於k+1.
另外,,你也可以自己修改修改,來加深理解.例如
boolean isPrime; //定義布爾變數判斷是否素數.是:true;否:false
for (int i = 3; i <= 100; i++) {
isPrime = true;
int k = (int) Math.sqrt(i);
for (int j = 2; j <= k; j++) {
if (i % j == 0) {
isPrime = false; //如果能夠有數整除i,那麼就不是素數.
break;
}
}
if (isPrime) {
System.out.println(i);
}
}
這樣就沒有必要在外層循環里就定義j這個變數了.如果我上面說的你理解還是比較困難,可以先理解用布爾變數來控制的寫法.這個理解了,用j > k 判斷的就也很容易理解了.
③ 利用Java判斷一個數是否是素數的演算法
//利用Java判斷一個數是否是素數的演算法
boolean f(int a){
boolean ean = true;
for(int i=2;i< Math.sqrt(a);i++){ //Math.sqrt 是調用Math類中的sqrt方法,求一個數的平方根
if(a%i==0){
ean = false;
break;
}
}
return ean;
}
④ java for循環 求素數
importjava.io.*;
classtest
{
publicstaticvoidmain(String[]args)throwsjava.lang.Exception
{
for(intn=2;n<100;n++){
booleanflag=true;
for(intm=2;m<n;m++){
if(n%m==0){
flag=false;
break;
}
}
if(flag){
System.out.println(n);
}
}
}
}
你自己看下吧,兩個for實現。
⑤ java編程求出2-n之間的所有素數。n由鍵盤輸入。
您好,我是軟體之家的♂北極熊熊,很高興為您解答。
==================================================================================
演算法:
一個數i,如果能被2到i-1整除的話,內循環就退出了,j都不會等於i的,只有全部循環完,即素數的話j才等於i,這時i才是素數,並輸出
------------------------------
定義變數n,i,j
輸入n
for(i=2;i<=n;i++)
{
for(j=2;j<=i-1;j++)
{
if(i%j==0)
break;
}
if(j==i)
輸出i並換行
}
把以上中文的部分改成JAVA相應的代碼就行了。
==================================================================================
如您滿意,謝謝五星採納~~~~~↖(*^ω^*)↗
⑥ JAVA求素數:for(j=2;j<=i/2;j++):是什麼意思為什麼i/2,為什麼沒有「{」
如上所述,不加{}的for的循環體只有後面緊接的一句,
為什麼是i/2,就是i的一半(呵呵貌似白說了哈),當i的一半賦給一個整型的數時,或i/2被當成一個整型的數使用時,它一半就是去掉小數後的數(向下取整,比如5的一半,就當是2)
因此,演算法大致的意思是這樣,一個3到100的數,如果這個數,都不能被2到這個數的一半的數整除的話,就是素數
------------以下是對補充問題的回答------------------------
第一個if,當i能被j(一個2到i一半的整數)整除的時候,跳出for(j=2;j<=i/2;j++){}循環體,當然for(j=2;j<=i/2;j++){}循環體什麼也沒做,就一個勁的判斷,當判斷到有的場合時跳出,沒有的話,j遞增,然後繼續循環
直到循環結束都沒出現當i能被j(一個2到i一半的整數)整除的場合時,也跳出循環體,而j的值在結束時加1,剛好大過或等於(i的一半加1)。
而i在以上的兩種情況跳出的場合,性質是不一樣的,第一種是非素數,第二種是素數,所以進行
第二個if,假如for(j=2;j<=i/2;j++){}循環體是在循環還沒結束時跳出的,值必定小於(i的一半加1),就什麼也不做,反之,是在循環結束時跳出的,那就是素數,就進行列印,
第三個if,沒用{}那麼隻影響下一句,效果就是每6個素數就分別多用一行空行格開,純粹格式不用在意
當然,如樓上,所說可以用i的平方根代替,可以減少檢驗次數
可能沒說清楚,可能啰嗦了點,呵呵,希望對你有幫助!
-------------------------------對補充的回答
這兩天沒上網XD,是的,沒有自增
⑦ 用java編寫一個程序段,輸入一個自然數,判斷該數是否為素數.
使用java編寫判斷自然數是否為素數的方式是,使用scanner來接受用戶輸入的數值,使用素數的演算法,實例如下:
Scannersr=newScanner(System.in);
System.out.print("請輸入a的值:");
inta=sr.nextInt();
booleanis=true;
if(a<1)
{
System.out.println(a+"不是質數,因為他小於一");
}
else
{
List<Integer>list=newArrayList<Integer>();
for(inti=2;i<a;i++)
{
if(a%i!=1&&a%i!=a)
{
if(a%i==0){
is=false;
list.add(i);
}
}
}
if(is){
System.out.println("a是質數");
}else{
Stringyz="";
for(inti=0;i<list.size();i++)
{
if(yz=="")
{
yz=yz+list.get(i);
}else{
yz=yz+","+list.get(i);
}
}
System.out.println("a不是質數,因為他含有因子"+yz);
}
}