B1027 打印沙漏

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328           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("\n");
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("\n");
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("\n");
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("\n");
33     }
34 
35     printf("%d", N - 2 * num * num + 1);
36 
37 
38     return 0;
39 }

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

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

B1027 打印沙漏

代码:

 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("\n");
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("\n");
34     }
35 
36     printf("%d", N - (bottom + 1) * (bottom + 1) / 2 + 1);
37 
38 
39     return 0;
40 }

 

 

 

 
上一篇:透视投影变换之CVV


下一篇:一些CSS技巧