`
蓝神100
  • 浏览: 10214 次
文章分类
社区版块
存档分类
最新评论

二重循环解题思路

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

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






分析:首先要明确我们需要打印的种类有:字符串”*”,字符串”  ”(空格)。比如第一行,先打印了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();// 每行的空格和”*”打印完后,需要换行
}
}
运行结果:




  • 大小: 627 Bytes
  • 大小: 1.8 KB
  • 大小: 1.9 KB
  • 大小: 627 Bytes
  • 大小: 552 Bytes
  • 大小: 4 KB
  • 大小: 552 Bytes
  • 大小: 552 Bytes
  • 大小: 959 Bytes
  • 大小: 5.9 KB
  • 大小: 941 Bytes
  • 大小: 1.6 KB
  • 大小: 3.2 KB
  • 大小: 941 Bytes
分享到:
评论

相关推荐

    二重循环输出九九乘法表.c

    二重循环输出九九乘法表.c 简洁的思路 利用两个for

    java二重循环for, 打印九九乘法表

    ### Java中的二重循环For与九九乘法表 #### 一、二重循环For的基础概念 在Java中,`for`循环是一种常用的循环结构,它由三部分组成:初始化...这不仅加深了我们对二重循环的理解,也为解决类似问题提供了参考思路。

    二重循环 乘法表.cpp

    二重循环 九九乘法表

    C语言的二重循环代码实现文档

    c语言,C语言的二重循环代码实现文档

    考研数学21种常用解题思路

    ### 考研数学21种常用解题思路详解 #### 第一部分:高数解题的四种思维定势 **1. 泰勒公式法** 当题目中的函数f(x)在某点二阶或者更高阶可导时,通常可以采用泰勒公式展开的方法来解决问题。这种做法尤其适用于...

    MATLAB工具箱大全-将多重循环转为单重循环-For-Each

    本篇将详细介绍如何使用MATLAB中的`for-each`循环将多重循环转换为单重循环,以提升程序性能。 `for-each`循环,也称为“foreach”或“遍历”循环,是MATLAB中处理数组、向量或细胞数组的一种高效方式。它允许我们...

    二重积分matlab.rar_MATLAB二重积分_二重积分_二重积分 MATLAB_二重积分MATLAB_积分 matlab

    在MATLAB中,二重积分是数值积分的一种重要应用,特别是在解决多变量函数的积分问题时。本资源提供了一个关于MATLAB实现二重积分的经典示例,旨在帮助用户理解和掌握这一功能。 MATLAB中的二重积分计算主要依赖于`...

    一类特殊二重循环矩阵逆矩阵的求法 (2002年)

    在这篇文献中,首先给出了二重循环矩阵的定义,然后引入了相关引理,即如果一个矩阵A是(n1,n2)型二重循环矩阵,那么其对应的伴随矩阵A-也是(n1,n2)型二重循环矩阵。接着,通过定理给出了一般情况下特殊二重循环矩阵...

    2009考研数学解题思路班讲义-微积分2.pdf

    从给定的文件信息来看,该文档主要涉及的是2009年考研数学中的微积分部分,特别是针对多元微积分的一些解题思路和方法。以下是对文档中提及的知识点进行详细解析: ### 多元微积分概念与方法 多元微积分是微积分学...

    用C++求解二重积分

    根据给定的信息,本文将详细解析如何利用 C++ 来计算二重积分,并对代码进行逐行解释,以便更好地理解整个实现过程。 ### 一、理解二重积分 在数学中,二重积分是对二维区域上的函数求积分的过程。它可以用于求解...

    蒙特卡洛法计算二重积分.rar_buffalorfm_carefully24s_二重积分r编程_蒙特卡洛_计算二重积分

    《蒙特卡洛方法在计算二重积分中的应用》 在数学领域,特别是在数值分析中,二重积分的计算是一项常见的任务。对于某些复杂的函数,传统的解析求解方法可能变得非常困难,这时我们可以借助计算机进行数值计算。其中...

    基于二重循环的数字水印算法 (2012年)

    针对现有数字水印算法中存在的抵抗联合攻击能力差、水印提取准确率不高等问题,提出了一种基于分块快速傅里叶变换(FFT)的二重循环数字水印算法.先进行图像大小归一化,对其进行分块FFT变换,在每个图像块的FFT系数...

    java九九乘法表

    在编程领域,尤其是在Java语言的学习过程中,"九九乘法表"是一个常见的练习项目,它主要涉及到了二重循环的概念。二重循环是程序设计中处理多层嵌套循环的一种方式,尤其在处理二维数组、矩阵或者类似表格的数据结构...

    c语言沙丘图案源代码!!!

    这是关于用c语言编写的沙丘图案的源代码!!!希望能给大家带来点帮助!!!

    二重积分-高等数学竞赛指导

    2. **例题的另外一种解法**:除了常规的求解方式,书中可能提供了不同的解题思路,这对于拓展思维、提升解题技巧极其有益。例如,对于一个给定的二重积分,可能可以通过变换坐标系或者改变积分次序来简化计算。 3. ...

    二重积分的计算

    ### 二重积分的计算 #### 一、直角坐标系下二重积分的计算原理与方法 **二重积分**是微积分学中的一个重要概念,尤其在解决涉及多变量问题时发挥着关键作用。本章节主要围绕二重积分的概念及其在直角坐标系下的...

    二重化脉冲整流器仿真模型及分析报告

    二重化脉冲整流器(Dual-Converter Pulse Width Modulation Rectifier)是一种先进的电力电子变换技术,广泛应用于工业、电力系统以及新能源领域。在本压缩包中,包含了一个详细的二重化脉冲整流器的Simulink模型,...

    基于MATLAB的蒙特卡罗方法求解二重积分.pdf

    文档中给出了具体的MATLAB代码片段,利用了while循环来生成随机点,并通过if条件语句来判断点是否位于积分域内。如果点在域内,根据蒙特卡罗方法的原理,将函数值累加。最终通过算术平均来计算积分值。 此外,文档...

Global site tag (gtag.js) - Google Analytics