Java基础06--流程控制03

本文详细介绍了Java中的流程控制,特别是无限循环结构,如for(;;)和while(true),并讲解了如何通过break和continue关键字来控制循环的执行。此外,还探讨了嵌套循环的概念和应用,包括不同类型的循环嵌套实例,如打印星形图案和九九乘法表。同时,文章提供了几个练习,如找出100以内的所有质数,通过不断优化代码提高运行效率。
摘要由CSDN通过智能技术生成

Java基础06--喝自己之前偷懒的洗脚水(六)

流程控制3

无限循环结构

不在循环条件部分限制次数的结构:for(;;) 或 while(true)

那么如何结束一个循环结构?
1.循环条件部分返回false;
2.在循环体中,执行break

示例代码:

import java.util.Scanner;
class ForWhileTest {
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);

		int positiveNum = 0;//记录正数的个数
		int negativeNum = 0;//记录负数的个数

		//while(true){
		for(;;){//与上面的结构效果一致
		 int num = scan.nextInt();

		 if(num > 0){
			positiveNum++;
		 }else if(num < 0){
			negativeNum++;
		 }else{
			//输入 0 的时候,跳出循环
			break;
		 }
		}
		System.out.println("输入的正数个数为:" + positiveNum);
		System.out.println("输入的负数个数为:" + negativeNum);
	}
}

break 和 continue 关键字

break 和 continue 关键字的使用

			使用范围		循环之中的作用(不同点)		相同点
breakswitch-case		
			循环结构中		结束当前循环				关键字后面不能声明执行语句

continue:	循环结构中		结束当次循环

示例代码:

class BreakContinueTest {
	public static void main(String[] args) {
		
		for(int i = 1;i <= 10;i++){
			
			if(i %4 == 0){
				
				//break;//123
				continue;//123567910
			}

			System.out.print(i);
		}

		System.out.println();
	}
}

嵌套循环结构

嵌套循环的使用
1. 嵌套循环:将一个循环结构A生命在另一个循环结构B的循环体中,
就构成了嵌套循环。
2.
外层循环:循环结构B
内层循环:循环结构A
3.
1)内层循环结构遍历一遍,只相当于外层循环执行了一次。
2)假设外层循环需要执行m次,内层循环需要执行n次。此时内层循环的循环体一共执行了 m*n 次。
3)技巧:
外层控制行数
内层控制列数

练习1:
用“*”打印出要求的图形

class ForForTest {
	public static void main(String[] args) {
		
		//

		/*

		******
		******
		******
		******
		
		*/
		for(int i = 1;i <= 4;i++){
			
			for(int j = 1;j <= 6;j++){
				System.out.print("*");
			}
			System.out.println();
		}

		System.out.println();

		/*
					i(行号)		j(*的个数)
		*			1			1
		**			2			2
		***			3			3
		****		4			4
		*****		5			5
		
		*/
		for(int i = 1;i <= 5;i++){//控制行数
			
			for(int j = 1;j <= i;j++){//控制列数
				System.out.print("*");
			}

			System.out.println();
		}

		/*
					i(行号)		j(*的个数)   规律:i + j = 5 即 j = 5 - i
		*			1			4
		**			2			3
		***			3			2
		****		4			1

		*/
		for(int i = 1;i <= 4;i++){//控制行数
			
			for(int j = 1;j <= 5 - i;j++){//控制列数
				System.out.print("*");
			}

			System.out.println();
		}

		/*
		
		----*- 
		---*-*- 
		--*-*-*-
		-*-*-*-*-
		*-*-*-*-*- 
		-*-*-*-*- 
		--*-*-*-
		---*-*- 
		----*- 
		
		- 为空格,方便观察
		*/

		//上半部分
		for(int i = 1;i <= 5;i++){
		
			for(int j = 1;j <= 5 - i;j++){
				System.out.print(" ");
			}
			for(int m = 1;m <= i;m++){
				System.out.print("* ");
			}

			System.out.println();
		}


		//下半部分
		for(int i = 1;i <= 5;i++){
		
			for(int j = 1;j <= i;j++){
				System.out.print(" ");
			}
			for(int m = 1;m <= 5 - i;m++){
				System.out.print("* ");
			}

			System.out.println();
		
		}
		
	}
}

练习2:
九九乘法表
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
… …
9 * 1 = 9 … … 9 * 9 = 81

class NineNineTable{
	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:
100以内的所有质数的输出。
质数:素数,只能被1和它本身整除的自然数
–>从2开始,到这个数-1为止,
都不能被这个数本身整除

最小的质数是:2

class PrimeNumberTest {
	public static void main(String[] args) {
		
		boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值

		for(int i = 2;i < 100;i++){//遍历100以内的自然数
		
			for(int j = 2;j < i;j++){//j:被i除
				
				if(i % j == 0){//i被j除尽
					
					isFlag = false;
				}
			}
			//如果isFlag没被修改,所以i就没被从2开始,到i-1除尽过
			if(isFlag == true){
				System.out.println(i);
			}
			//重置isFlag
			isFlag = true;
		}
	}
}

练习4:练习3Plus版

100000以内的所有质数的输出。
对PrimeNumberTest.java 文件(练习三中的代码)中的指数输出问题进行优化
实现方式1:

class PrimeNumberTest1 {
	public static void main(String[] args) {
		
		boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值

		//获取当前时间距离1070-01-01 00:00:00 的毫秒数
		Long start = System.currentTimeMillis();

		int count = 0;//记录质数的个数
		
		for(int i = 2;i < 100000;i++){//遍历100以内的自然数
		
			//优化2(i-->Math.sqrt(i)):对本身是质数的自然数是有效的
			for(int j = 2;j < Math.sqrt(i);j++){//j:被i除
			//for(int j = 2;j < i;j++){//j:被i除
				
				if(i % j == 0){//i被j除尽
					
					isFlag = false;
					break;//优化1:只对本身非质数的自然数是有效的
				}
			}
			//如果isFlag没被修改,所以i就没被从2开始,到i-1除尽过
			if(isFlag == true){
				//System.out.println(i);//输出拖慢了程序的效率
				count++;
			}
			//重置isFlag
			isFlag = true;
		}
		//获取当前时间距离1070-01-01 00:00:00 的毫秒数
		Long end = System.currentTimeMillis();
		
		System.out.println("质数的个数为:" + count);

		System.out.println("当前程序运行花费时间为:"+ (end - start));
		//未优化的花费时间 19978ms --------------------> 14052ms(去掉输出语句后的时间,下同)
		//优化1(加了break后):花费时间为 2596ms -----> 1083ms
		//优化2:花费时间为 1022ms --------------------> 12ms
	}
}

练习5:练习3Plus修改版

100000以内的所有质数的输出。
对PrimeNumberTest.java 文件(练习三中的代码)中的指数输出问题进行优化
实现方式2:

class PrimeNumberTest2 {
	public static void main(String[] args) {
		
		
		//获取当前时间距离1070-01-01 00:00:00 的毫秒数
		Long start = System.currentTimeMillis();

		int count = 0;//记录质数的个数
		
		label:for(int i = 2;i < 100000;i++){//遍历100以内的自然数
		 
			for(int j = 2;j < Math.sqrt(i);j++){//j:被i除
			
				if(i % j == 0){//i被j除尽
					continue label;//结束label这个循环的本次循环
				}
			}
			//执行到此步骤的都是质数
			count++;
			
		}
		//获取当前时间距离1070-01-01 00:00:00 的毫秒数
		Long end = System.currentTimeMillis();
		
		System.out.println("质数的个数为:" + count);

		System.out.println("当前程序运行花费时间为:"+ (end - start));
		//12ms
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值