打印沙漏

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

复制代码
*****
 ***
  *
 ***
*****

 

 

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

1)实验代码

```

 2 #include<stdio.h>

3 #include<math.h>
 4 int main(){
 5     int i,a,k,n,g=1,t;
 6     char ch=*;
 7    scanf("%d %c",&n,&ch);
 8     while(2*pow(i,2)-1<=n){
 9         g++;
 10     }
11     g--;
12     k=g;
13    for(i=1;i<=g;i++){
14        for(a=1;a<i;a++){
15            printf(" ");
16         }
17        for(a=1;a<=2*g-1;a++){
18             printf("%c",ch);
19        }
20        g--;
21         printf("\n");
22     }
23    t=k;
24    g=2;
25     for(i=2;i<=k;i++){
26         for(a=1;a<=t-i;a++){
27            printf(" ");
28   }
29        for(j=2*g-1;a>0;a--){
30             printf("%c",ch);
31         }
32         printf("\n");
33        g++;
34    }
35    printf("%d\n",n-(2*pow(t,2)-1));
36     return 0;
37 }

```

(2)解题思路:1.把沙漏分成上半三角和下半三角来看。

2.符号*的总个数与第一行的个数和总行数,总列数有关(第一行个数=总行数=总列数)。每一行*个数减二等于下一行*个数,直到中间只有一个*。

思维导图:

https://www.edrawsoft.cn/viewer/public/s/b5e79973047842

是以中心的*划分两个部分,是一个等差数列,且规律是从中心点2乘以x减去1个*。先确定是多少行,并且上下对称所以需要同时增加。

要注意每一行前面要用空格补位置,但是后面没有空格。

(3)解题过程中存在的问题,以及如何得到解决的:之前在沙漏的右边以为有空格,一直答案错误,经过删去有关右边输出空格的代码后问题解决

(4)运行截图

 

posted @ 2019-02-13 14:04  焦迈奇  阅读(396)  评论(1编辑  收藏  举报