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"); } }
运行截图: