zoukankan      html  css  js  c++  java
  • B1027 打印沙漏

              1027 打印沙漏 (20 分)
     

    本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

    *****
     ***
      *
     ***
    *****
    

    所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

    给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

    输入格式:

    输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

    输出格式:

    首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

    输入样例:

    19 *
    

    输出样例:

    *****
     ***
      *
     ***
    *****
    2

    初步答案:
     1 #include <stdio.h>
     2 int main()
     3 {
     4     int N;
     5     char ch;
     6     scanf("%d %c", &N, &ch);
     7 
     8     int num = 1;            //记录上三角的行数
     9 
    10     for (int i = 1; i <= N; i++)
    11     {
    12         if (2 * i * i - 1 <= N)
    13             num = i;
    14         else
    15             break;
    16     }
    17 
    18     //打印上三角
    19     for (int i = 0; i < num; i++)
    20     {
    21         for (int j = 0; j < i; j++)
    22             printf(" ");
    23         for (int j = i; j < (num - i) * 2 - 1 + i; j++)
    24             printf("%c", ch);
    25         printf("
    ");
    26     }
    27 
    28 
    29     //打印下三角
    30     for (int i = 2; i <= num; i++)
    31     {
    32         for (int j = 0; j < num - i; j++)
    33             printf(" ");
    34         for (int j = num - i; j < i * 2 - 1 + num - i; j++)
    35             printf("%c", ch);
    36         printf("
    ");
    37     }
    38 
    39     printf("%d", N - 2 * num * num + 1);
    40 
    41 
    42     return 0;
    43 }

    看了答案后改进后的答案:

    1.我之前计算上三角的行数是用枚举的方式,其实可以直接用2 * row ^2 - 1 <= N; 解出这个不等式row <= sqrt((N + 1)/2)'

    2.打印字符其实从0开始到2 * row - 1即可,不必在开始条件和结束条件中都加上前面空格的数量

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 int main()
     5 {
     6     int N;
     7     char ch;
     8     scanf("%d %c", &N, &ch);
     9 
    10     int num = 1;            //记录上三角的行数
    11 
    12     num = (int)sqrt((N + 1.0) / 2);
    13 
    14     //打印上三角
    15     for (int i = 0; i < num; i++)
    16     {
    17         for (int j = 0; j < i; j++)
    18             printf(" ");
    19         for (int j = 0; j < (num - i) * 2 - 1; j++)
    20             printf("%c", ch);
    21         printf("
    ");
    22     }
    23 
    24 
    25     //打印下三角
    26     for (int i = 2; i <= num; i++)
    27     {
    28         for (int j = 0; j < num - i; j++)
    29             printf(" ");
    30         for (int j = 0; j < i * 2 - 1; j++)
    31             printf("%c", ch);
    32         printf("
    ");
    33     }
    34 
    35     printf("%d", N - 2 * num * num + 1);
    36 
    37 
    38     return 0;
    39 }

    答案的做法似乎更加巧妙:

    以下是答案的解题思路和代码:

    代码:

     1 #include <stdio.h>
     2 #include <math.h>
     3 
     4 int main()
     5 {
     6     int N;
     7     char c;
     8     scanf("%d %c", &N, &c);
     9 
    10     int bottom = (int)sqrt((N + 1.0) * 2) - 1;    //底边星型字符的数量
    11     if (bottom % 2 == 0)    //如果bottom是偶数,bottom减一变成奇数
    12         bottom--;
    13 
    14     for (int i = bottom; i >= 1; i -= 2)
    15     {
    16         for (int j = 0; j < (bottom - i) / 2; j++)
    17             printf(" ");
    18 
    19         for (int  j = 0; j < i; j++)
    20             printf("%c", c);
    21 
    22         printf("
    ");
    23     }
    24 
    25     //打印下三角
    26     for (int i = 3; i <= bottom; i += 2)
    27     {
    28         for (int j = 0; j < (bottom - i) / 2; j++)
    29             printf(" ");
    30         for (int j = 0; j < i; j++)
    31             printf("%c", c);
    32 
    33         printf("
    ");
    34     }
    35 
    36     printf("%d", N - (bottom + 1) * (bottom + 1) / 2 + 1);
    37 
    38 
    39     return 0;
    40 }
     
  • 相关阅读:
    IE6-9中tbody的innerHTML不能赋值bug
    matchesSelector及低版本IE中对该方法的实现
    JavaScript日期组件的实现
    IE6/7/8中parseInt第一个参数为非法八进制字符串且第二个参数不传时返回值为0
    子程序设计原则
    仅IE6中链接A的href为javascript协议时不能在当前页面跳转
    JavaScript获取图片的原始尺寸
    JavaScript判断图片是否加载完成的三种方式
    Mac OS X 快捷键
    IE6-8中Date不支持toISOString方法
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/11297524.html
Copyright © 2011-2022 走看看