首先樓主應(yīng)該對素數(shù)的定義已經(jīng)清楚了吧?其實就是一個數(shù),如果存在1和它本身以外,有數(shù)能整除它,這個數(shù)就不是素數(shù).
創(chuàng)新互聯(lián)建站公司2013年成立,先為懷遠等服務(wù)建站,懷遠等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為懷遠企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在這里,有2個關(guān)鍵的變量,我估計解釋一下你就能看得明白這個算法了.
1.關(guān)于變量k.變量k的作用是優(yōu)化整個算法,因為比如要判斷一個數(shù)13是不是素數(shù),我們沒必要從2循環(huán)到13.只要循環(huán)到對13開根號.13開根號大概是3.6多,強轉(zhuǎn)為int類型后是3.也就是說只要檢查2,3是否能整除13.如果不能,13肯定是一個素數(shù).因為比如48這個數(shù),你前面檢測到被4整除等于12,那么繼續(xù)循環(huán)超過Math.sqrt(48)的話,無非就是得到一個反過來的被12除等于4的結(jié)果.這個沒有必要.
2.關(guān)于變量j.注意點1:j是在最外層的循環(huán)體中定義的.這個時候剛定義完,j的值是初始的0.然后j從2開始,一直到小于等于k結(jié)束.這里是控制嘗試整除的循環(huán)次數(shù).一旦發(fā)現(xiàn)在這個范圍內(nèi)有數(shù)能整除i,那么就跳出循環(huán).
所以,對于你不理解的那個部分,首先確定一點,程序只要執(zhí)行到break,就說明這個數(shù)是素數(shù).
例如我們這次k = 10,那么是要從j = 2到10逐一檢測 i 是不是能被 j 整除.當j = 7的時候比如可以整除了,就跳出當前內(nèi)層循環(huán)了.這時候, j 顯然是不大于 k 的,因為只要是中途跳出,因為內(nèi)層循環(huán)(j = 2; j = k; j++)的控制,只要在循環(huán)過程中跳出來的,那么j 肯定 = k.
只有循環(huán)到j(luò) = 10依然沒有break的話,根據(jù)for循環(huán)的執(zhí)行順序,會執(zhí)行j++,然后去判斷j = k 是否為true,為true則繼續(xù)下一次循環(huán),否則循環(huán)結(jié)束.而在這里,如果到10還沒有能夠整除的話,j是會在10的基礎(chǔ)上自增的.這時候j就=11了.
那么if ( j k )就不成立了,則i 不會被輸出.
總結(jié)一點:就是如果中途or最后一次循環(huán),找到能整除的數(shù)了,那么因為break的關(guān)系,最后就不會執(zhí)行 j++, 所以j k (亦即j = k 的取反)表示沒有找到能整除的數(shù).其實j最大也就只能等于k+1.
另外,,你也可以自己修改修改,來加深理解.例如
boolean isPrime; //定義布爾變量判斷是否素數(shù).是: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; //如果能夠有數(shù)整除i,那么就不是素數(shù).
break;
}
}
if (isPrime) {
System.out.println(i);
}
}
這樣就沒有必要在外層循環(huán)里就定義j這個變量了.如果我上面說的你理解還是比較困難,可以先理解用布爾變量來控制的寫法.這個理解了,用j k 判斷的就也很容易理解了.
輸出前500個素數(shù)
其中
for
(int
i
=
2;
i
=
math.sqrt(k);
i++)
從2開始,1不用比較,如果還有另外一個不是他本身的數(shù)可以整除他,那他就不是素數(shù)
math.sqrt(k)
是原先一個人提出的算法,加大效率的,你可以測試看看
已經(jīng)按照你的要求用到了while和if
else
下面的朋友···別人說要用什么寫就用什么寫···有時候按要求去就好了
class
a
{
public
static
void
main(string
arg[])
{
int
num
=
0;
int
k=2;
while
(num
500)
{
if
(isprime(k))
{
system.out.print(k
+
"
");
num++;
}
k++;
}
}
public
static
boolean
isprime(int
k)
{
if
(k
==
2)
return
true;
else
if
(k
%
2
==
0)
return
false;
else
{
for
(int
i
=
2;
i
=
math.sqrt(k);
i++)
if
(k
%
i
==
0)
return
false;
return
true;
}
}
}
我給你個算法,言簡意賅
int?n?=?23;//所求素數(shù)范圍(0-n以內(nèi))
int?j?=?1;
for?(int?i?=?2;?i??n;?i++)?{
for?(j?=?2;?j??i;?j++)?{
if?(i?%?j?==?0)
break;
}
if?(j?=?i)?{
System.out.println(i);
}
}
為了實現(xiàn)一個Java應(yīng)用程序,用于計算20000000~300000000之間所有的素數(shù),可以按照以下步驟來實現(xiàn):
定義一個Java類,用于表示計算素數(shù)的應(yīng)用程序。例如,可以定義一個PrimeNumberCalculator類,它包括一個靜態(tài)的calculate方法,用來計算并打印出20000000~300000000之間所有的素數(shù)。
在calculate方法中,使用for循環(huán)來遍歷20000000~300000000之間的所有整數(shù),并使用素數(shù)判定的算法來判斷每個整數(shù)是否為素數(shù)。例如,可以使用埃氏篩法來判定素數(shù)。
在判定素數(shù)的過程中,可以使用Java的并發(fā)編程功能來提升計算性能。例如,可以使用Executor框架來創(chuàng)建多個線程,每個線程負責計算一部分整數(shù)是否為素數(shù),最終在主線程中匯總結(jié)果并打印出來。
在計算完成后,可以在主函數(shù)中調(diào)用PrimeNumberCalculator類的calculate方法,來啟動應(yīng)用程序。