1. 嵌套循环的使用

1. 定义

将一个循环结构 A 声明在另一个循环结构 B 的循环体中,就构成了嵌套循环

2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class ForForTest {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.print("*");
}
System.out.println('\n');

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

/* i(行号) j(*的个数)
* 1 1
** 2 2
*** 3 3
**** 4 4
***** 5 5
*/
for (int i = 0; i < 5; i++) {
for (int j = 0; 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 = 0; i < 4; i++) {
for (int j = 0; j < 4 - i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}

3. Tip

  1. 内层遍历一遍,相当于外层循环一次
  2. 假设外层循环执行 m 次,内层循环执行 n 次。
    此时内层循环的循环体一共执行了 m * n 次

4. 九九乘法表

1
2
3
4
5
6
7
8
9
10
public 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) + "\t");
}
System.out.println();
}
}
}

2. break,continue,label 的基本使用

1. break,continue 的基本使用

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

2. java 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public 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.println("今晚迪丽热巴要约我!!!");
}
System.out.print(i);
}
System.out.println();

for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 10; j++) {
if(j % 4 == 0){
break;
}
System.out.print(j);
}
System.out.println();
}

label:for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break label;//结束指定标识的一层循环结构
continue label;//结束指定标识的一层循环结构当次循环
}
System.out.print(j);
}
System.out.println();
}
}
}

2. 求 100000 以内的所有质数的输出(逐渐优化)

1. 方法 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class PrimeNumberTest {
public static void main(String[] args) {
boolean isFlag = true;

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;
break;
}
}
if(isFlag == true){
System.out.println(i);
}
isFlag = true; //重置isFlag
}
}
}

2.方法 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class PrimeNumberTest1 {
public static void main(String[] args) {
boolean isFlag = true;
int count = 0;//记录质数的个数

long start = System.currentTimeMillis();//时间戳

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除尽
isFlag = false;
break;
}
}
if(isFlag == true){
//System.out.println(i);
count++;
}
isFlag = true; //重置isFlag
}

long end = System.currentTimeMillis();//时间戳
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13
}
}

3. 方法 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class PrimeNumberTest2 {
public static void main(String[] args) {
int count = 0;//记录质数的个数
long start = System.currentTimeMillis();//时间戳

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;
}
}
//能执行到此步骤的,都是质数
count++;
}

long end = System.currentTimeMillis();//时间戳
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13
}
}