zoukankan      html  css  js  c++  java
  • 下三角形的一些思考

    一、下等腰三角形

    问题描述:用双重循环实现以下图形的输出

        AA
       ABBA
      ABCCBA
     ABCDDCBA
    ABCDEEDCBA
     ABCDDCBA
      ABCCBA
       ABBA
        AA

    1、思考过程

    通过分析,将输出分为两大块。一为上三角,即从第1行到第i行,另外为下三角,即从第i+1行到2*i-1行。开始时,自己又另外将上三角分为三个模块:空格模块、A->最大字母以及最大字母->A。那么这样分析后,就很好办了。

    输入:上三角行数a

    输出

    • 第1行到第i行:用j控制行数(from 1 to i),则先输出a - i个空格,然后输出A->A+i,最后输出A+i->A
    • 第i+1行到2i-1行:可以用j控制行数(from 1 to i-1)(又从1计数,这和输出无关)。则先输出i - j个空格,然后输出A->A+i,最后输出A+i->A

    反正这些变量太麻烦了,简直让人讨厌。有没有其他方法呢?头脑里闪过数学中对称思想,利用这种思想,就简单了很多了。

    输出中第i+1行到2i-1行类似第1行到第i行的倒置,不过行数反过来而已。而输出A+i->A则可以看作是输出A->A+i对称,直接将循环控制语句稍作修改即可。

    2、总结

    其实开始时没有很好地利用对称信息,最终浪费了较多时间。如果能发现规律,则能较快地解决问题。

    今天纠结的另外一个问题是输出A+i->A。初始代码如下:

        for ( k = i; k >= 1; k-- )
        {
            printf("%c", 'A'+k-1);
        }
        printf("
    ");

    这就相当于控制变量从i开始,那么规律则是+k。稍加总结,就可得出'A'+k-1规律。

    通过这道题目,加深了循环命令的掌握。

    3、附最后程序代码,如下:

    /*
     * 作    者: 林龙
     * 专业班级:计算机学院
     * 完成日期:2014 年 3 月7 日
     * 版 本 号:v1.0
     * 输入描述:上三角行数
     * 问题描述:下等腰三角形(不同字母组成)
     * 程序输出:
            AA
           ABBA
          ABCCBA
         ABCDDCBA
        ABCDEEDCBA
         ABCDDCBA
          ABCCBA
           ABBA
            AA        
     * 算法设计:用双重循环进行控制,外循环控制行,内循环控制列(每行输出的字符个数)
     */
    #include <stdio.h>
    void PriAlpha( int a );
    int main()
    {
        PriAlpha( 5 );
        return 0;
    
    }
    
    void PriAlpha( int a )
    {
        int i, j, k;
        for ( i = 1; i <= a ; i ++ )
        {
            // 输出空格
            for (  j = 1; j <= a - i ; j ++ )
            {
                printf(" ");
            }
            // 输出A-最大字母
            for ( k = 1; k <= i; k ++ )
            {
                printf("%c", 'A'+k-1);
            }
            // 输出最大字母-A
            for ( k = 1; k <= i; k ++ )
            {
                printf("%c", 'A'+i-k);
            }
            printf("
    ");
        }
        // 下三角输出,只是上三角控制语句修改而已
        for ( i = a - 1; i >= 1 ; i -- )
        {
    
            for (  j = 1; j <= a - i ; j ++ )
            {
                printf(" ");
            }
            for ( k = 1; k <= i; k ++ )
            {
                printf("%c", 'A'+k-1);
            }
            for ( k = 1; k <= i; k ++ )
            {
                printf("%c", 'A'+i-k);
            }
            printf("
    ");
        }
    }

    参考

    双重循环的应用实例--等腰三角形相关

  • 相关阅读:
    Java学习二十九天
    Java学习二十八天
    47. Permutations II 全排列可重复版本
    46. Permutations 全排列,无重复
    subset ii 子集 有重复元素
    339. Nested List Weight Sum 339.嵌套列表权重总和
    251. Flatten 2D Vector 平铺二维矩阵
    217. Contains Duplicate数组重复元素
    209. Minimum Size Subarray Sum 结果大于等于目标的最小长度数组
    438. Find All Anagrams in a String 查找字符串中的所有Anagrams
  • 原文地址:https://www.cnblogs.com/miraclecoder/p/4051187.html
Copyright © 2011-2022 走看看