Java 打印菱形 三个for循环解决问题 (找公式)

之前也看过其他大佬的问题,大部分都是分两个大的for循环分别打印菱形的上部分和下部分。如果不将上下两个部分分开,我们这个循环该怎么写?

 num int类型,菱形的总行数

helf int类型,是菱形行数的一半,也就是num/2

我这里写的代码可以看到我就用了三个for循环:

最外层的for循环负责打印菱形行数

里面包着的第一个for循环负责打印空格也就是编辑格式

第二个也就是打印菱形啦。

而我们这个菱形打印实现的 关键 就在于这中间两个for循环的 判断部分

那我们这边举一个例子解析一下这两个判断部分是如何思考的:

假设我们菱形行数 num 7

得下图 空格用-代替

菱形                行数             空格数量          星号数量

---*                     0                      3                    1 

--***                   1                      2                     3

-*****                  2                     1                     5

*******                3                      0                     7

-*****                  4                      1                     5

--***                   5                       2                     3

---*                    6                       3                      1

总行数              7    行数的一半为 3(7/2 == 3)

按照上面的数据

我们先考虑空格如何打印。

先看上半部分,从 第0行第3行,我们可以发现用 行数的一半 减去 当前行数 正好等于我们上半部分的空格数量

3-0=3、3-1=2、3-2=1、3-3=0

所以我们得到公式 helf - i = 上半部分空格数。

同样我们将这个公式带入到下半部分从 第4行第6行 得到的结果就是

3-4=-1、3-5=-2、3-6=-3

而我们需要的结果是 

3-4=(1)、3-5=(2)、3-6=(3)

那我们是不是只要设置一个绝对值就可以了?

因此我们第一个循环的判断条件就出来了 只需要你的循环次数小于你的总行数的一半减去当前行数后的值取它的绝对值就是我们需要打印的当前行数的空格数量

那*号如何打印呢?

同样的我们按照上面考虑空格打印的思路先考虑我们星号打印的上半部分 ,也就是从第0行到第3行,我们分别打印1,3,5,7个星号。现阶段我们还看不出什么,我们换一种列法:

0==》1 、1==》3、2==》5、3==》7

行数的一半为3,我们循环从0开始。那我们上半部分可不可以写这么一个公式 

行*2,也就是

for(int j=0;j<i*2;j++)

那我们按照这个思路,研究下半部分我们就需要做到如下情况

4==》2==》5、5==》1==》3、6==》0==》1

如果按照这个流程那我们就可以直接得出6-你的下半段的行数就可以得到2 1 0。但我们上半段的公式是行数*2,好像跟我们下半段不太合适的样子。

如果用我们一般的行数呢,也就是我们的helf 能不能代入到我们的公式呢,这里我也是卡了很久,因为迟迟找不到思路,一直钻着6-行数的路子,因此尝试了一下带入helf看看能不能行,毕竟helf代表的数字是我们行数的一半,也是我们中间最长的行数,起一个承上启下的左右。

那用行数%helf 上半段 ( 除去中间第三行以外 ) 好像没有什么问题,照样我行我素。但是到了下半段就得到了 1 2 0;那跟我们的2 1 0 好像有了一点相似,那我们怎么转换呢?

先看前面两个数字 1跟2 和 2跟1,他们的和正好是helf 也是我们的3

那我们是不是可以在 行数%helf的基础上加上或者减去一个3然后通过取绝对值获取到我们的1 和2呢。初步尝试了一下得到了公式

Math.abs(i%helf - helf)

到这里我们先总结一下行数为4 为5没有问题,但是到1 2  6的时候就出现了各种问题

所以这个-helf我们不能随便加,如何控制它呢? i/helf ,当我们加入i/helf之后我们的数据在

1,2,3,4,5的时候就没什么大问题,但是到了6就会出现多个星号的问题。这样是因为当我们的i为6的时候,i/helf == 2 ,最后导致我们取到的绝对值是 12那我们最后会打印13个星号。所以我们要在

i/helf的基础上加个%2去限制这个6。最后得到公式

Math.abs(i%helf - helf*(i/helf))

到这里我们通过三个for循环打印菱形算是讲完了,第一次做这个东西没啥经验,欢迎各位大佬,各位和我一样的小萌新给我留言评论,有啥有趣的代码也可以分享给我研究研究(*^▽^*)。后面我如果遇到什么有趣的代码的时候也会发博客分享给大家的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值