[JAVA] 99乘法表的镜像

时间:2022-10-10 00:45:21

前些天做循环嵌套练习,打印99乘法表。

并且练习了老师所说的“不是规律的规律”——

打印三角形尖朝上:改变内循环条件,使其随外循环初始值的变化而变化;

打印三角形尖朝下:改变内循环初始值,使其随外循环初始值的变化而变化;


99乘法表代码如下:


for(int x=1; x<=9; x++)
{
for(int y=1; y<=x; y++)
{
System.out.print(y+"*"+x+"="+x*y+"\t");
}
System.out.println();
}

这样的写法好处是:


内外循环的条件及循环后操作语句格式比较统一,方便阅读。


但后来发现,如果我想打印一次99表的镜像,这个不是规律的规律则不好用了。


需求:


本体:

1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
----------------------------------

镜像:
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*4=4 2*4=8 3*4=12 4*4=16
1*3=3 2*3=6 3*3=9
1*2=2 2*2=4
1*1=1


在这个例子里,因为如果单纯的用“尖朝下”规律来进行改动的话,并不能打印出镜像。

所以我的做法是——


先来看成功的镜像代码:


for(int x=9; x>=1; x--)
{
for(int y=1; y<=x; y++)
{
System.out.print(y+"*"+x+"="+x*y+"\t");
}
System.out.println();
}

然后开始分析:


首先通过简单的文本复制粘贴,得到需要打印的镜像图形。


因为打印输出语句

System.out.print(y+"*"+x+"="+x*y+"\t");
}
System.out.println();

这部份是不变的,内循环打印语句打印x和y的乘法算式,外循环打印语句负责换行。

由第一句得出,算式中首先出现的数值是y,然后是*,再其次是x,最后是=和乘积。


然后根据第一行图像得出,y的值在进行自增。并且从1增加到9然后停止。

于是得出结论,内循环语句写法应为:

for(int y=1; y?; y++)

此时内循环条件还不确定。


这时来看第一列。

y不变,x的值在进行自减,从9减到1然后停止。

于是得出结论,外循环语句写法应为:

for(int x=9; x>=1; x--)

这个时候代码基本成型:


for(int x=9; x>=1; x--)
{
for(int y=1; y?; y++)
{
System.out.print(y+"*"+x+"="+x*y+"\t");
}
System.out.println();
}

由于知道内循环中,y的值为自增,初步判断条件应为

y<=9

但这样写会出现一个问题,最终打印的结果会是一个矩阵,而不是99表镜像。

原因如下:


当第一行打印完毕后,条件不满足跳出内循环,到外循环开始执行x=8的打印。

这时,条件满足后跳入内循环,由于y初始化值为1,条件为y<=9,所以语句会将y的值从1到9再打印一次,

这样第二行的元素数(列数)依然为9.

以此类推,最终会变成打印出9*9的乘法算式矩阵。


所以。


为了让内循环条件随着外循环的变化而变化,此时内循环条件应为:

y<=x


如此一来,当语句执行到内循环时,每行的元素数(列数)就会随着外循环的自减而依次减少。


最终完成镜像的打印。