在一个循环语句内部再嵌套一循环或多个循环,称为嵌套循环。while、do-while与for循环可以任意嵌套多层。
多重循环执行过程:外层循环变量变化一次,内层循环变量要变化一遍
【随堂练习】
1、 在控制台先打印矩形,然后再打印平行四边形,再然后打印等腰三角形。
/**
* 打印矩形
* ************
* ************
* ************
* ************
* 多重循环执行过程:外层循环变量变化一次,内层循环变量要变化一遍 。
*/
// 外侧循环:控制行数
for(int i = 0; i < 4; i++) {
// 内侧循环:控制列数
for(int j = 0; j < 13; j++) {
System.out.print("*");
}
System.out.println();
}
/**
* 打印平行四边形
* ************
* ************
* ************
* ************
* 思路:选择嵌套循环。外侧循环,用于控制打印的行数,内侧循环,分别用于控制打印空格和星星的个数
* 行数 空格 星星
* 0 0 13
* 1 1 13
* 2 2 13
* 3 3 13
* i i 13
*/
// 外侧循环:控制行数
for(int i = 0; i < 6; i++) {
// 内侧循环:控制空格
for(int j = 0; j < i; j++) {
System.out.print(" ");
}
// 内侧循环:控制星星
for(int j = 0; j < 13; j++) {
System.out.print("*");
}
System.out.println();
}
/**
* 打印等腰三角形
* *
* ***
* *****
* *******
* *********
* 思路: 选择嵌套循环。外侧循环控制行数,内侧循环控制空格和星星的个数!
* 行数 空格 星星
* 0 4 = 5-0-1 1 = 2*0+1
* 1 3 = 5-1-1 3 = 2*1+1
* 2 2 = 5-2-1 5 = 2*2+1
* 3 1 = 5-3-1 7 = 2*3+1
* 4 0 = 5-4-1 9 = 2*4+1
* i 总行数-i-1 2*i+1
*/
int length = 9;
// 外侧循环:控制行数
for(int i = 0; i < length; i++) {
// 内侧循环:控制空格
for(int j = 0; j < length - i - 1; j++) {
System.out.print(" ");
}
// 内侧循环:控制星星
for(int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
/**
* 思考:如何实现打印菱形和空心菱形???
* *
* ***
* *****
* *******
* *********
* *******
* *****
* ***
* *
*
* *
* * *
* * *
* * *
* * *
* * *
* * *
* * *
* *
*/
2、 使用嵌套循环实现九九乘法表。
// 外侧循环:控制行数
for(int i = 1; i <= 9; i++) {
// 内侧循环:控制列数
for(int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + i*j + "\t");
}
System.out.println();
}
3、 **[难]**输入0-9之间的一个数,输出数字构成的1~5位整数的和,如输入2,则计算出2 + 22 + 222 + 2222 + 22222之和。
/**
* 实现步骤:
* 1.获得[0, 9]之间的正整数,假设输入的正整数num=5
* 2.获得5,55,555,5555,5555
* 定义一个变量result,并设置result的初始值为0
* 第一趟:result *= 10; result += num; --> result = 5
* 第二趟:result *= 10; result += num; --> result = 55
* 第三趟:result *= 10; result += num; --> result = 555
* 第四趟:result *= 10; result += num; --> result = 5555
* 第五趟:result *= 10; result += num; --> result = 55555
* 因为每一趟的代码都是一模一样,所以我们使用循环来实现,循环的次数为:5次
* 3.定义一个变量,用于累加5,55,555,5555,5555之和
*/
// 1.获得[0, 9]之间的正整数
Scanner input = new Scanner(System.in);
System.out.print("请输入[0, 9]之间的整数:");
int num = input.nextInt();
// 2.获得5,55,555,5555,5555
int result = 0, sum = 0;
// 每一趟循环,要求分别得到:5,55,555,5555,5555
for(int i = 0; i < 5; i++) {
result *= 10;
result += num;
// 3.用于累加5,55,555,5555,5555之和
sum += result;
}
System.out.println("sum:" + sum);
4、**[难]**搬砖问题:36块砖,36个人搬,男搬4块,女搬3块,两个小孩搬1块,要求一次搬完,问需要男、女、小孩各多少人?
/**
* 思路分析:
* 条件:男人 + 女人 + 小孩 == 36 && 男人搬砖数量 + 女人搬砖数量 + 小孩搬砖数量 == 36
* 我们只需列举出男人、女人和小孩的人数区间范围,然后计算机依次去判断匹配即可!
* 男人的取值范围???[0, 9]
* 女人的取值范围???[0, 12]
* 小孩的取值范围???[0, 36]
*/
// 控制男人的人数
for(int x = 0; x < 9; x++) {
// 控制女人的人数
for(int y = 0; y < 12; y++) {
// 控制小该的人数
for(int z = 0; z < 36; z += 2) {
// 满足:男人人数 + 女人人数 + 小孩人数 === 36 && 男人搬砖数 + 女人搬砖数 + 小孩搬砖数 == 36
if(x + y + z == 36 && x*4 + y*3 + z/2 == 36) {
System.out.println("男人:" + x + " 女人:" + y + " 小孩:" + z);
}
}
}
}
5、 **[难]**假如有一对小兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,请问每个月的兔子总数为多少对?(假设到24个月)
/**
* 思路分析:
* 第一月 第二月 第三月 第四月 第五月 第六月
* 小兔子 1 1 1 2 3 5
* 老兔子 0 0 1 1 2 3
* 总兔子 1 1 2 3 5 8
* 规律:当前月份兔子总数 = 上个月兔子总数 + 上上个月兔子总数
* 第一月和第二月的兔子总数都是为1对,然后第三月到第二十四月的兔子数可以通过规律来获得
* 获取第三个月到第二十四个月之间每个月份的兔子数,应该使用循环来实现。循环的次数22次,可以从[3, 24]之间循环。
*/
// 上上个月的兔子总数
int first = 1; // 初始值为第一个月的兔子总数
// 上个月兔子总数
int second = 1; // 初始值为第二个月的兔子总数
// 通过循环,获取第三个月到第二十四个月之间的兔子总数
for(int i = 3; i <= 24; i++) {
// 假设此处获取的是第i月的兔子总数
// i月兔子总数 = i-2个月兔子总数 + i-1月兔子总数
int result = first + second; // result = 2
// 更新first和second的值,为获取下一个月做准备
first = second;
second = result;
System.out.println("第" + i + "个月兔子数:" + result);
}
6、 **[难]**中国古代数学家研究出了计算圆周率最简单的办法:
PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17… 这个算式的结果会无限接近于圆周率的值,我国古代数学家祖冲之计算出,圆周率在3.1415926和3.1415927之间,请编程计算,要想得到这样的结果,他要经过多少次…
/**
* 思路分析:
* 因为不确定需要计算多少次,所以采用死循环!假设循环变量为i,初始值为0
* 当计算出来的圆周率在:3.1415926到3.1415927之间,则跳出死循环
* 分析:PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17......
* 发现分子永远为4,分母规律为:2*i+1
* 另外,当循环变量为偶数时,做累加操作;当循环变量为奇数时,做累减操作!
*/
// 定义一个变量,用于保存计算出来的圆周率
double PI = 0;
// 定义一个循环变量,初始值为0
int index = 0;
// 定义一个死循环,用于计算PI的取值
while(true) {
// 计算圆周率的操作
if(index % 2 == 0) { // 偶数
PI += 4.0/(2*index+1);
} else { // 奇数
PI -= 4.0/(2*index+1);
}
// 循环变量累加
index++;
// 满足PI在3.1415926到3.1415927之间,则跳出死循环
if(PI >= 3.1415926 && PI <= 3.1415927) {
System.out.println(index);
break;
}
}
ps:如需最新的免费文档资料和教学视频,请添加QQ群(627407545)领取。