二重循环解题思路--颜群

本文通过一道习题,讲解做二重循环习题的思路:

题目:使用二重循环打印如下图形:

分析:首先要明确我们需要打印的种类有:字符串”*”,字符串”  ”(空格)。比如第一行,先打印了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 = 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)原创,转载请注明出处。

时间: 2024-11-07 17:18:11

二重循环解题思路--颜群的相关文章

二重循环解题思路

本文通过一道习题,讲解做二重循环习题的思路: 题目:使用二重循环打印如下图形: 分析:首先要明确我们需要打印的种类有:字符串"*",字符串"  "(空格).比如第一行,先打印了4个空格"  ",然后打印了一个"*" . 我们分析一下每行的具体打印情况: 第0行:先打印4个空格,然后打印1个"*" 第1行:先打印3个空格,然后打印3个"*" 第2行:先打印2个空格,然后打印5个"

Larry&#39;s Array 解题思路及过程

先甩链接https://www.hackerrank.com/challenges/larrys-array 首先想到的一个思路是:从数列中找最小值并确定最小值的位置 1. 如果最小值的位置在数列的第一位,则在1..n中继续找次小值所在的位置(可以理解为移除首位的最小值,然后在剩余数列中寻找最小值): 2. 如果最小值的位置在数列的第二位,则选取0..3三个数组成子数列进行一次轮转将最小值移至首位 3. 如果最小值的位置在数列的第二位之后,则选取最小值之前的两个数与最小值一起组成子数列进行两次轮

使用二重循环打印图形

使用二重循环打印以下图形 * * * * * * * * * * * * * * * * * * public class Text{ public static void main(string[]args){ for( ){ for(int k=0;k<=2-Marth.abs(i);k++){ System.our.print(" ") } for(int j=0;j<Marth.abs(i)*2+1;j++){ System.out.print("*&qu

20150805 Day07 数组,二重循环

数组: 1.打擂比较算法 if(num>max){ max=num; //没有break! } 2.数组排序 sun公司并没有提供一个方法专门用于降序排列,但是我们可以转换一下思路,先对数组中元素进行升序排列,然后降序输出数组中元素. 3.在我们自己的类中,可以对多个系统类进行导入使用.例如可同时使用Arrays和Scanner 二重循环: 1.直角三角形 * ** *** **** ***** *号(j)          行号(i) 1                 1 2        

&quot;巴卡斯杯&quot; 中国大学生程序设计竞赛 - 女生专场(重现)解题思路

此文章可以使用目录功能哟↑(点击上方[+]) 经过这么一次女生赛,告诉我们千万不要小瞧女生,不然会死得很惨,orz... 链接→"巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场(重现)  Problem 1001 Solving Order Accept: 0    Submit: 0 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit : 32768/32768 K (Java/Others)  Problem Descri

9/17 越努力越幸运-思维赛(3.0) 解题思路

A 题意:给4个数,它们为3个数其中两两相加之和和三个数相加之和,求这三个 解题思路:先找出所给的4个数的最大值,然后用最大值从后面分别减去另外三个数输出的就是所求的三个数 #include<stdio.h> #include<math.h> #include<string.h> int main() { int a,b,c,d,max=0,x[4],i; while(~scanf("%d%d%d%d",&a,&b,&c,&a

入门python知识点总结以及15道题的解题思路分析

知识点总结 一.序列 操作符 x in s 如果x是列表s的元素,返回True,否则False s + t 连接两个序列s和t s*n或者n*s 将序列s复制n次 s[i] 返回s中第i元素 s[i:j]或s[i:j: k] 切片,返回序列s中第i到j-1以k为步长的元素子序列 函数 len(s) 返回序列的长度 min(s) 返回序列的最小值 max(s) 返回序列的最大值 s.index或s.Index(x,i,j) 索引从i到j-1中第一次出现x的位置 s.count(x) 返回x在s中出

LeetCode解题思路:595. Big Countries

There is a table World +-----------------+------------+------------+--------------+---------------+ | name | continent | area | population | gdp | +-----------------+------------+------------+--------------+---------------+ | Afghanistan | Asia | 652

securityoverridehacking challenge 解题思路汇总——JavaScript

通过了Advanced部分( securityoverridehacking challenge 解题思路汇总--Advanced),下面就进入JavaScript了.总的来说,这个部分比较简单,因为JavaScript是高度可控的东西.也就是说,安全角度而言,JavaScript是不可信的. 4        Javascript 4.1       Login Bypass 这题比较容易让人想多,逛了下hint,发现很简单.观察,首先请求了index.php,然后跳转到了fail.php,并