7-1 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19
输出样例:
2
1)实验代码
include "stdio.h"
int main()
{
int n;
int x , z;
int i, s, b;
char c;
scanf("%d %c",&n,&c);
for (x = 3; ;x =x + 2)
{
z = (1 + x)(x / 2 + 1)-1;
if (z >= n)
break;
}
x = x-2;
s=x;
b=1;
while(x >= 1)
{
for(i = 1;i < b; i++ )
printf(" ");
for(i = 1;i <= x; i++)
printf("%c",c);
printf("
");
x=x-2;
b++;
}
b=b-2;
x=x+4;
while(x<=s)
{
for(i = 1; i <b ; i++)
printf(" ");
for(i=1 ; i <= x ; i++)
printf("%c",c);
printf("
");
x=x+2;
b--;
}
x=x-2;
z = (1 + x)(x / 2 + 1)-1;
printf("%d
" , n-z);
return 0;
}
}2) 设计思路
首先找一下规律:***** 5
*** 3
* 1
*** 3
***** 5
其实这个漏斗是一个等差数列:5 3 1 3 5.公差为2,首项为1,但是是对称的。
那么题目和代码中给定的n就是和了。我们想知道对于一个给定的n,我们在尾项(x)为多少,或者说有多少项((x/2+1)2,也就是后面的h2-1)的时候能够使得和z(代码中理解为面积)能够满足小于n,并且使得这个x最大,所以一开始从3开始,一直求一个最大的x(尾项),使得和能够满足。但是要注意的是当判断出这个尾项x的时候,x已经不满足了!前一个x才是我们想要的,所以要x-2.
至于b,代码中理解为行。我理解为项数,比如说b=3,那么就是有3行:1 3 5.但是要打印漏斗状,所以要对称,还要再打印一行。
运行结果截图