本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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("
");
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("
");
33 g++;
34 }
35 printf("%d
",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)运行截图