打印沙漏

Posted ValarMorghulis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打印沙漏相关的知识,希望对你有一定的参考价值。

题目描述:

  

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

 题解基础嵌套for循环变形,难点在于运用肉眼观察法找出符号*的总数N和每行按等差数列1,3,5...分布的数字前n项和Sn的规律

即:

Sn = n*n;

Tn = 2Sn -1;

通过此关系式在代码中逆向推出n的范围以及剩余符号res的值

还有一个注意点是单行*只需要输出一次,打印沙漏下方的时候要注意空格和行数的关系

 1 #include<stdio.h>
 2 int main()
 3 {
 4     char c;
 5     int N;
 6     int n;
 7     scanf("%d %c",&N,&c);
 8     //寻找小n的值
 9     if(N<7)
10         n = 1;
11     else
12     {
13     for(int i=1;i<N;i++)
14     {
15          if(2*i*i-1>N)
16          {
17              n = i-1;
18              break;
19          }
20     } 
21     }
22     //循环打印
23     int res = N-(2*n*n-1);
24     for(int i=n;i>0;i--)
25     {
26         for(int k=i;k<n;k++)
27         {
28             printf(" ");
29         }
30         for(int j=2*i-1;j>0;j--)
31         {    
32             printf("%c",c);
33         }
34         
35         printf("\n");
36         
37     }
38     
39     for(int i=0;i<n-1;i++)
40     {
41         for(int j=i;j<n-2;j++)
42         {
43             printf(" ");
44         }
45         for(int k=0;k<2*(i+2)-1;k++)
46         {
47             printf("%c",c);
48         }
49         printf("\n");
50     }
51      printf("%d\n",res);
52     
53 return 0;    
54 } 

 

以上是关于打印沙漏的主要内容,如果未能解决你的问题,请参考以下文章

打印沙漏

L1-002. 打印沙漏

CCCC L1-002. 打印沙漏图形打印

L1-002. 打印沙漏

打印沙漏

打印沙漏