二重循环解题思路
2016-12-15 13:42
357 查看
本文通过一道习题,讲解做二重循环习题的思路:
题目:使用二重循环打印如下图形:
![](https://img-blog.csdn.net/20161215134340092?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分析:首先要明确我们需要打印的种类有:字符串”*”,字符串” ”(空格)。比如第一行,先打印了4个空格” ”,然后打印了一个”*” 。
我们分析一下每行的具体打印情况:
![](https://img-blog.csdn.net/20161215134756676?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第0行:先打印4个空格,然后打印1个”*”
第1行:先打印3个空格,然后打印3个”*”
第2行:先打印2个空格,然后打印5个”*”
第3行:先打印1个空格,然后打印7个”*”
第4行:先打印0个空格,然后打印9个”*”
通过上面分析,我们不难发现,”第0行”, ”第1行”… ”第4行”这些行数在重复,所以我们可以用外层循环控制行数(即打印第几行)。在每行的内部,”打印n个空格”又是一个重复的过程,所以可以用内层循环来控制打印空格的个数。同理,在每行的内部,”打印n个*”也是一个重复的过程,所以可以用内层循环来控制打印”*”的个数。即:用外层循环控制打印的行数,用两个内层循环分别控制打印空格的个数和打印”*”的个数。还要注意,在把每行的空格和”*”打印完后,还需要换行。
即可得伪代码:
public static void main(String[] args) {
int rows = 5;
for (int i = 0; i <
行数; i++) {
for (int j
4000
= 0; j <
空格的个数; j++) {
System.out.print(" ");
}
for (int j = 0; j <
"*"的个数; j++) {
System.out.print("*");
}
System.out.println();//每行的空格和”*”打印完后,需要换行
}
}
我们在用i表示行数(第几行),用j表示打印空格的个数,用k表示打印”*”的个数,可得下表:
![](https://img-blog.csdn.net/20161215135423503?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分析外层循环和内层循环的数学关系,可得:
i+j=4 即j=4-i=(rows-1)-i, 即空格的个数等于:(当前行数-1)-i
k=2*i+1 ,即”*”的个数等于: 2*当前行数+1
现在,用计算后的关系式将伪代码中的汉字替换,即可实现等腰三角形的打印:
public static void main(String[] args)
throws Exception {
int rows = 5;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//每行的空格和”*”打印完后,需要换行
}
}
运行结果:
![](https://img-blog.csdn.net/20161215135445613?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
思考:现将题目变为:打印倒等腰三角形,如图:
![](https://img-blog.csdn.net/20161215135500238?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
该如何实现呢?
分析:对比“正等腰三角形”和“倒等腰三角形”,如下
![](https://img-blog.csdn.net/20161215135524812?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
不难发现,“倒等腰三角形”的第0行,就是“正等腰三角形”的最后一行;“倒等腰三角形”的第1行,就是“正等腰三角形”的倒数第二一行;…;“倒等腰三角形”的最后一行,就是“正等腰三角形”的第一行。即:把“正等腰三角形”的行数逆序输出,就变成了“倒等腰三角形”。控制“正等腰三角形”行数的是外层循环for (int i
= 0; i < rows; i++),将它逆序输出,即改为for (int i = rows-1; i>=0; i--),就实现了“倒等腰三角形”的打印,如下:
public static void main(String[] args)
throws Exception {
int rows = 5;
// for (int i = 0; i < rows; i++)正等腰三角形
for (int i = rows - 1; i >= 0; i--) {//
将“正等腰三角形”等行数逆序输出
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
}
运行结果:
![](https://img-blog.csdn.net/20161215135547410?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
思考:现将题目变为:打印菱形,如图:
![](https://img-blog.csdn.net/20161215135606895?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
该如何实现呢?
分析:
将菱形上下拆开、一分为二,即可分为“正等腰三角形”和“到等腰三角形”,如图:
![](https://img-blog.csdn.net/20161215135836770?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
因此,只需要先打印“正等腰三角形”,然后再打印“到等腰三角形”即可。需要注意,菱形的中间那一行,既是“正等腰三角形”的最后一行,同时也是“倒等腰三角形”的第一行。因此,在打印“正等腰三角形”时,不需要打印最后一行,如下:
public static void main(String[] args)
throws Exception {
int rows = 5;
// 正等腰三角形
//for (int i = 0; i < rows; i++) {
for (int i = 0; i < rows-1; i++) {//将for的第二个参数从row变为row-1,即无需打印"正等腰三角形"的最后一行
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
// 倒等腰三角形
for (int i = rows - 1; i >= 0; i--) {//
将“正等腰三角形”等行数逆序输出
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
}
运行结果:
![](https://img-blog.csdn.net/20161215135901302?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
思考:
现将题目变为:打印空心菱形,如图:
![](https://img-blog.csdn.net/20161215135921349?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
该如何实现呢?
分析:
![](https://img-blog.csdn.net/20161215135944771?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
实心菱形与空心菱形的区别是:空心菱形就是实心菱形的边界,如下图:
![](https://img-blog.csdn.net/20161215135958834?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
,即在打印“实心菱形”的“*”时,只需要把每一行“*”的开头第一个“*”和结尾最后一个“*”打印出来,每行中间部分的“*”用空格替代即可。即对System.out.print("*");进行判断,伪代码如下:
if (开头第一个“*” 或 结尾最后一个“*”)
{
System.out.print("*");
} else {//即中间部分打印空格
System.out.print(" ");
}
完整代码如下:
public static void main(String[] args)
throws Exception {
int rows = 5;
// 正等腰三角形
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {//开头第一个“*”
或 结尾最后一个“*”
System.out.print("*");
} else {//即中间部分打印空格
System.out.print(" ");
}
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
// 倒等腰三角形
// for (int i = rows - 1; i >= 0; i--) {
for (int i = rows - 2; i >= 0; i--) {// “倒等腰三角形”的第0行(即rows-1)不用打,直接从第1行(rows-2)开始打印
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {//开头第一个“*”
或 结尾最后一个“*”
System.out.print("*");
} else {//即中间部分打印空格
System.out.print(" ");
}
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
}
运行结果:
![](https://img-blog.csdn.net/20161215140021990?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGFucWlhb19yanh5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
来源:http://xueyuan.lanqiao.org,解释权归蓝桥软件学院所有。
题目:使用二重循环打印如下图形:
分析:首先要明确我们需要打印的种类有:字符串”*”,字符串” ”(空格)。比如第一行,先打印了4个空格” ”,然后打印了一个”*” 。
我们分析一下每行的具体打印情况:
第0行:先打印4个空格,然后打印1个”*”
第1行:先打印3个空格,然后打印3个”*”
第2行:先打印2个空格,然后打印5个”*”
第3行:先打印1个空格,然后打印7个”*”
第4行:先打印0个空格,然后打印9个”*”
通过上面分析,我们不难发现,”第0行”, ”第1行”… ”第4行”这些行数在重复,所以我们可以用外层循环控制行数(即打印第几行)。在每行的内部,”打印n个空格”又是一个重复的过程,所以可以用内层循环来控制打印空格的个数。同理,在每行的内部,”打印n个*”也是一个重复的过程,所以可以用内层循环来控制打印”*”的个数。即:用外层循环控制打印的行数,用两个内层循环分别控制打印空格的个数和打印”*”的个数。还要注意,在把每行的空格和”*”打印完后,还需要换行。
即可得伪代码:
public static void main(String[] args) {
int rows = 5;
for (int i = 0; i <
行数; i++) {
for (int j
4000
= 0; j <
空格的个数; j++) {
System.out.print(" ");
}
for (int j = 0; j <
"*"的个数; j++) {
System.out.print("*");
}
System.out.println();//每行的空格和”*”打印完后,需要换行
}
}
我们在用i表示行数(第几行),用j表示打印空格的个数,用k表示打印”*”的个数,可得下表:
分析外层循环和内层循环的数学关系,可得:
i+j=4 即j=4-i=(rows-1)-i, 即空格的个数等于:(当前行数-1)-i
k=2*i+1 ,即”*”的个数等于: 2*当前行数+1
现在,用计算后的关系式将伪代码中的汉字替换,即可实现等腰三角形的打印:
public static void main(String[] args)
throws Exception {
int rows = 5;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//每行的空格和”*”打印完后,需要换行
}
}
运行结果:
思考:现将题目变为:打印倒等腰三角形,如图:
该如何实现呢?
分析:对比“正等腰三角形”和“倒等腰三角形”,如下
不难发现,“倒等腰三角形”的第0行,就是“正等腰三角形”的最后一行;“倒等腰三角形”的第1行,就是“正等腰三角形”的倒数第二一行;…;“倒等腰三角形”的最后一行,就是“正等腰三角形”的第一行。即:把“正等腰三角形”的行数逆序输出,就变成了“倒等腰三角形”。控制“正等腰三角形”行数的是外层循环for (int i
= 0; i < rows; i++),将它逆序输出,即改为for (int i = rows-1; i>=0; i--),就实现了“倒等腰三角形”的打印,如下:
public static void main(String[] args)
throws Exception {
int rows = 5;
// for (int i = 0; i < rows; i++)正等腰三角形
for (int i = rows - 1; i >= 0; i--) {//
将“正等腰三角形”等行数逆序输出
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
}
运行结果:
思考:现将题目变为:打印菱形,如图:
该如何实现呢?
分析:
将菱形上下拆开、一分为二,即可分为“正等腰三角形”和“到等腰三角形”,如图:
因此,只需要先打印“正等腰三角形”,然后再打印“到等腰三角形”即可。需要注意,菱形的中间那一行,既是“正等腰三角形”的最后一行,同时也是“倒等腰三角形”的第一行。因此,在打印“正等腰三角形”时,不需要打印最后一行,如下:
public static void main(String[] args)
throws Exception {
int rows = 5;
// 正等腰三角形
//for (int i = 0; i < rows; i++) {
for (int i = 0; i < rows-1; i++) {//将for的第二个参数从row变为row-1,即无需打印"正等腰三角形"的最后一行
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
// 倒等腰三角形
for (int i = rows - 1; i >= 0; i--) {//
将“正等腰三角形”等行数逆序输出
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
}
运行结果:
思考:
现将题目变为:打印空心菱形,如图:
该如何实现呢?
分析:
实心菱形与空心菱形的区别是:空心菱形就是实心菱形的边界,如下图:
,即在打印“实心菱形”的“*”时,只需要把每一行“*”的开头第一个“*”和结尾最后一个“*”打印出来,每行中间部分的“*”用空格替代即可。即对System.out.print("*");进行判断,伪代码如下:
if (开头第一个“*” 或 结尾最后一个“*”)
{
System.out.print("*");
} else {//即中间部分打印空格
System.out.print(" ");
}
完整代码如下:
public static void main(String[] args)
throws Exception {
int rows = 5;
// 正等腰三角形
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {//开头第一个“*”
或 结尾最后一个“*”
System.out.print("*");
} else {//即中间部分打印空格
System.out.print(" ");
}
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
// 倒等腰三角形
// for (int i = rows - 1; i >= 0; i--) {
for (int i = rows - 2; i >= 0; i--) {// “倒等腰三角形”的第0行(即rows-1)不用打,直接从第1行(rows-2)开始打印
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {//开头第一个“*”
或 结尾最后一个“*”
System.out.print("*");
} else {//即中间部分打印空格
System.out.print(" ");
}
}
System.out.println();//
每行的空格和”*”打印完后,需要换行
}
}
运行结果:
来源:http://xueyuan.lanqiao.org,解释权归蓝桥软件学院所有。
相关文章推荐
- 浙大PAT 1008. 数组元素循环右移问题 (解题思路)
- leetCode 108.Convert Sorted Array to Binary Search Tree(将排序数组转换为BST) 解题思路和方法
- 南邮CTF逆向题第三道Py交易解题思路
- 浙大PAT 1013. 数素数 (解题思路)
- 浙大PAT 2-12. 两个有序链表序列的交集 (解题思路)
- Trailing Zero解题思路及java代码实现
- 斐波那契数列的两种解题思路:递归VS迭代
- 10道Hadoop面试真题及解题思路
- 实验吧简单的sql注入解题思路
- java中使用二重循环打印图形
- 一道淘汰85%面试者的百度开发者面试题——解题、参考答案和优化思路
- n皇后2种解题思路与代码-Java与C++实现
- LeetCode Weekly Contest 26解题思路
- 2018年美国大学生数学建模竞赛(MCM/ICM) E题解题思路
- JAVA学习代码——二重循环
- [LeetCode] Maximum Subarray 解题思路
- leetcode 729与731. My Calendar II的通用解题思路
- 一道仅有7人通过的超5星微软比赛题目-------解题思路&优秀代码分享,邀你来“找茬儿”
- 【算法笔记】动态规划,三个例题(解题思路与C++代码)
- leetCode 12.Integer to Roman (整数转罗马数字) 解题思路和方法