Java實現100000以內的質數的輸出的優化過程
我們知道計算機去執行演算法是需要時間的,小數以內的時間我們可能不會覺得慢,但是在大繁瑣的程式中還是會覺得很慢的;
下面我們看一下輸出100000以內的質數如何實現優化的一個過程:
首先我們看一個可以實現輸出質數的程式:
public static void main(String[] args) {
boolean flag=false;
long start=System.currentTimeMillis();//系統輸出的一個時間毫秒為單位
for(int i=2;i<=100000;i++){
for(int j=2;j<i;j++){
if(i%j==0){
flag=true;
}
}
if(flag==false){
System.out.println(i);
}
flag=false;
}
long end=System.currentTimeMillis();//系統輸出的一個時間毫秒為單位
System.out.println(end-start);//14391這是輸出的時間
}
這個程式輸出時間為14391毫秒,那麼可以感覺出這個不算快,我們還有更好的辦法嗎?
上面可以看出第二個迴圈在i%j的時間就算能夠知道不是質數的情況 下還在繼續和其他數作取模;比如6取模2不是質數,但是6還會去取模3,4,5;所以程式執行了一些不必要的東西;
下面看一下優化後的程式
public static void main(String[] args) {
boolean flag=false;
long start=System.currentTimeMillis();
for(int i=2;i<=100000;i++){
for(int j=2;j<i;j++){
if(i%j==0){
flag=true;
break;
}
}
if(flag==false){
System.out.println(i);
}
flag=false;
}
long end=System.currentTimeMillis();
System.out.println(end-start);//1281
}
看一下這個變動並不大,但是起到的作用非常大,加了break;如果不是質數就跳出此迴圈了;還是可以節省很多時間的;那麼有沒有更快的呢?
public static void main(String[] args) {
boolean flag=false;
long start=System.currentTimeMillis();
for(int i=2;i<=100000;i++){
for(int j=2;j<Math.sqrt(i);j++){
if(i%j==0){
flag=true;
break;
}
}
if(flag==false){
System.out.println(i);
}
flag=false;
}
long end=System.currentTimeMillis();
System.out.println(end-start);//76
}
看一下這個又節省了將近一半的時間,所以還是很不錯的,這裡是在迴圈中加了方法Math.qrat(i)代表根號的意思,這樣程式又會節省很多不必要的運算;
還有一種方法:
public static void main(String[] args) {
long start=System.currentTimeMillis();
lable:for(int i=2;i<=100000;i++){
for(int j=2;j<Math.sqrt(i);j++){
if(i%j==0){
continue lable;
}
}
System.out.println(i);
}
long end=System.currentTimeMillis();
System.out.println(end-start);//63
}