zoukankan      html  css  js  c++  java
  • 金字塔/菱形打印方法

    一、金字塔打印算法原理与实现

    粗一看无从下手,好像很有规律,但又无法简单地总结出打印规律。

    把“*”号用数字表示,规律开始变得明显,我们采用补全法,把这个三角形补成一个矩形让规律更明显。

    假设打印的行数为6,*号以外地方(上图绿色区域)用空格表示。

    第一行:(6-1)*2 个空格 ========= 1个星号

    第二行:(6-2)*2个空格==========3个星号

    第三行:(6-3)*2个空格==========5个星号

    第四行:(6-4)*2个空格==========7个星号

    第五行:(6-5)*2个空格==========9个星号

    第六行:(6-6)*2个空格(即没有空格)==========11个星号

    我们可以得到以下规律:

    第N行:(ROWS-N)*2个空格 =====(2N-1)个星号

    二、金字塔打印算法源码

     1 #include <stdio.h>
     2 
     3 int main(int argc, char *argv[])
     4 {
     5     int rows;
     6 
     7     printf("Please  input rows:
    ");
     8     scanf("%d",&rows);
     9 
    10     for(int i=1;i<=rows;++i)
    11     {
    12         int star = 2*i -1 ;     //星号个数
    13         int space = rows - i;   //空格个数
    14 
    15         //左边空格
    16         for(int j=0;j<space;++j)
    17             printf(" ");
    18 
    19         //中间 *
    20         for(int j=0;j<star;++j)
    21             printf("*");
    22 
    23         //右边空格
    24         for(int j=0;j<space;++j)
    25             printf(" ");
    26 
    27         //换
    28         printf("
    ");
    29     }
    30 
    31     return 0;
    32 }

    三、金字塔打印算法总结

     核心算法

    1         //rows表示总行数  i表示当前是第几行
    2         //空格个数
    3         int space = rows - i;
    4         //*个数
    5         int star = 2*i -1 ;

    四、菱形打印

    菱形打印其实金字塔打印的进阶版,等于 正向金字塔 + 反向金字塔。(一站式C语言编程 6.5小节 习题二答案)

     1 #include <stdio.h>
     2 
     3 int diamond(int, char);
     4 int draw(int, int, char);
     5 
     6 int main(int argc, char *argv[])
     7 {
     8     diamond(3, '*');
     9     diamond(4, '*');
    10     diamond(5, '+');
    11     return 0;
    12 }
    13 
    14 int diamond(int lines, char mask)
    15 {
    16     int rows;
    17     if (lines % 2 == 0)
    18     {
    19         printf("输入值%d为偶数,打印错误
    ", lines);
    20         return 0;
    21     }
    22     else
    23         rows = (lines + 1) / 2;
    24 
    25     // 分两部分打印,上半部分为rows行,下半部分为(rows - 1)行;
    26     for (int i = 1; i <= rows; ++i)
    27         draw(i, rows, mask);
    28 
    29     //下半部分反向打印,所以是逆序循环
    30     for (int i = rows - 1; i >= 0; i--)
    31         draw(i, rows, mask);
    32 }
    33 
    34 int draw(int i, int rows, char mask)
    35 {
    36     int star = 2 * i - 1; //star个数
    37     int space = rows - i; //space个数
    38 
    39     for (int j = 0; j < space; ++j) //左边空格
    40         printf(" ");
    41 
    42     for (int j = 0; j < star; ++j) //中间 *
    43         printf("%c", mask);
    44 
    45     for (int j = 0; j < space; ++j) //右边空格
    46         printf(" ");
    47 
    48     printf("
    "); //分行
    49 }

    可以把draw函数代码放进diamond函数中,但是会出现重复代码,嵌套层数也会增加,不符合增量式开发的原则。最后的打印结果为:

  • 相关阅读:
    Java设计模式之代理模式
    Java设计模式之单例模式
    Android 退出多Activity的application的方式
    自己动手系列——实现一个简单的LinkedList
    自己动手系列——实现一个简单的ArrayList
    Java多线程基础——Lock类
    制作一个功能丰富的Android天气App
    IdentityServer4 学习二
    IdentityServer4 学习一
    SC创建服务编写bat脚本
  • 原文地址:https://www.cnblogs.com/echo1937/p/10058511.html
Copyright © 2011-2022 走看看