java-迴圈結構的例題
阿新 • • 發佈:2020-08-05
1.從鍵盤輸入個數不確定的整數,並判斷輸入的正數和負數的個數,輸入為0時結束程式。
提示:最簡單“無限”迴圈格式:while(true),for(;;),無限迴圈存在的原因是因為並不知道要迴圈多少次,需要根據迴圈體內部的某些條件,來控制迴圈的結束。
程式碼實現:
import java.util.Scanner; class ex{ public static void main(String[] args){ int count1=0; int count2=0; while(true){ System.out.println("請輸入一個整數:"); Scanner scan=new Scanner(System.in); int n=scan.nextInt(); if(n>0){ count1++; } else if(n<0){ count2++; } else break; } System.out.println("正數的個數為"+count1); System.out.println("負數的個數為"+count2); } }
執行結果:
2.列印九九乘法表
程式碼實現:
class ex{ public static void main(String[] args){ for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ System.out.print(i+"*"+j+"="+(i*j)+" "); } System.out.println(); } } }
執行結果:
3.100000以內的所有質數的輸出
質數:素數,只能被1和它本身整除的自然數。==> 從2開始到n-1結束,都不能被這個數整除。
最小的質數:2
注意:(1既不是質數也不是合數)
程式碼:
實現方法一程式碼:(效率差)
class ex{ public static void main(String[] args){ boolean isFlag=true;//定義一個標識 //獲取當前時間距離1970-01-01 00:00:00的毫秒數 long start=System.currentTimeMillis(); for(int i=2;i<=100000;i++){//遍歷10000以內的自然數 for(int j=2;j<i;j++){ if(i%j==0){//能除盡——但這裡不能用break,因為會退出當前迴圈 isFlag=false;//標識設為false } } if(isFlag==true){//如果為true,說明都不能除盡 System.out.println(i); } //重置isFlag isFlag=true; } long end=System.currentTimeMillis(); System.out.println("所花費的時間為:"+(end-start)+"s"); } }
執行截圖:
演算法優化一
程式碼:
class ex{ public static void main(String[] args){ boolean isFlag=true;//定義一個標識 //獲取當前時間距離1970-01-01 00:00:00的毫秒數 long start=System.currentTimeMillis(); for(int i=2;i<=100000;i++){//遍歷100000以內的自然數 for(int j=2;j<i;j++){//被i去除 if(i%j==0){//能除盡——但這裡不能用break,因為會退出當前迴圈 isFlag=false;//標識設為false break;//優化1 遇到了能除盡的,就退出裡邊的迴圈:只對本身非質數的自然數有效 } } if(isFlag==true){//如果為true,說明都不能除盡 System.out.println(i); } //重置isFlag isFlag=true; } long end=System.currentTimeMillis(); System.out.println("所花費的時間為:"+(end-start)+"s"); } }
執行截圖:
演算法優化二程式碼:
class ex{ public static void main(String[] args){ boolean isFlag=true;//定義一個標識 //獲取當前時間距離1970-01-01 00:00:00的毫秒數 long start=System.currentTimeMillis(); for(int i=2;i<=100000;i++){//遍歷100000以內的自然數 for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0){//能除盡——但這裡不能用break,因為會退出當前迴圈 isFlag=false;//標識設為false break;//優化1 遇到了能除盡的,就退出裡邊的迴圈:只對本身非質數的自然數有效 } } if(isFlag==true){//如果為true,說明都不能除盡 System.out.println(i); } //重置isFlag isFlag=true; } long end=System.currentTimeMillis(); System.out.println("所花費的時間為:"+(end-start)+"s"); } }
執行截圖:
演算法優化三:
程式碼:
class ex{ public static void main(String[] args){ boolean isFlag=true;//定義一個標識 //獲取當前時間距離1970-01-01 00:00:00的毫秒數 long start=System.currentTimeMillis(); for(int i=2;i<=100000;i++){//遍歷100000以內的自然數 for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0){//能除盡——但這裡不能用break,因為會退出當前迴圈 isFlag=false;//標識設為false break;//優化1 遇到了能除盡的,就退出裡邊的迴圈:只對本身非質數的自然數有效 } } if(isFlag==true){//如果為true,說明都不能除盡 System.out.println(i);//如果不想顯示,可以統計一下質數的個數,在這裡count++(記得在開頭要初始化為0) } //重置isFlag isFlag=true; } long end=System.currentTimeMillis(); System.out.println("所花費的時間為:"+(end-start)+"s"); } }
執行截圖:
優化方法四:(這個方法相比之前的只是輸出的資料少了—註釋了一條語句,添了一條語句,如果你把之前的三種優化方法都照著這種改一下,都會變快很多)
程式碼:
class ex{ public static void main(String[] args){ boolean isFlag=true;//定義一個標識 int count=0; //獲取當前時間距離1970-01-01 00:00:00的毫秒數 long start=System.currentTimeMillis(); for(int i=2;i<=100000;i++){//遍歷10000以內的自然數 for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0){//能除盡——但這裡不能用break,因為會退出當前迴圈 isFlag=false;//標識設為false break;//優化1 遇到了能除盡的,就退出裡邊的迴圈:只對本身非質數的自然數有效 } } if(isFlag==true){//如果為true,說明都不能除盡 //System.out.println(i); count++; } //重置isFlag isFlag=true; } long end=System.currentTimeMillis(); System.out.println("所花費的時間為:"+(end-start)+"s"); } }
實現方式二:(運用到了continue關鍵字)
class ex{ public static void main(String[] args){ boolean isFlag=true;//定義一個標識 int count=0; //獲取當前時間距離1970-01-01 00:00:00的毫秒數 long start=System.currentTimeMillis(); label:for(int i=2;i<=100000;i++){//遍歷10000以內的自然數 for(int j=2;j<=Math.sqrt(i);j++){ if(i%j==0){//能除盡——但這裡不能用break,因為會退出當前迴圈 continue label;//優化2 遇到了能除盡的,就退出裡邊的迴圈:只對本身非質數的自然數有效 } } count++;//能執行到此步驟的都是質數 } long end=System.currentTimeMillis(); System.out.println("質數的個數為:"+count); System.out.println("所花費的時間為:"+(end-start)+"s"); } }
執行截圖: