本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
19 *输出样例:
*****
***
*
***
*****
2
***
*
***
*****
2
思路:
其实沙漏可以看作两个等差数列之和,讨论沙漏层数level与打印点数S之间的关系。数列A首项为1,公差为2,项数大于1时,项数与沙漏层数的关系是 n1=(level+1)/2;
另一个数列B首项为3,公差为2。 项数大于1时,n2=(level-1)/2;
根据等差数列求和公式,level大于1时,有 S=(a1+an)*n/2=(1+level)*n1/2+(3+level)*n2/2=((1+level)^2-1)/2①;
当level=1时,满足①。
代码:
#include <math.h>
#include <stdio.h>
int hourglass(int num,char sign)
{
int level=(int)(sqrt(2*(num+1))-1);
//index是行计数器,i是左侧空格计数器,j是字符计数器,i,j取决于index
int index,i,j;
int leave;
if(num>=1)
{
for(index=level;index>=1;index-=2)
{
for(i=0;i<(level-index)/2;i++)
{
printf(" ");
}
for(j=0;j<index;j++)
{
printf("%c",sign);
}
printf("\n");
}
for(index=3;index<=level;index+=2)
{
for(i=0;i<(level-index)/2;i++)
{
printf(" ");
}
for(j=0;j<index;j++)
{
printf("%c",sign);
}
printf("\n");
}
//等差数列求和
leave=num-((3+level)*(level-1)/2)/2*2-1;
}
leave=0;
printf("%d",leave);
return 0;
}
总结:
1 一开始找关系的时候只去观察序列号和符号数量之间的关系,而实际上,层数和符号数量之间的关系是本题重点,而且可喜的是,符号数最多的层数与沙漏层数恰恰相等、
2 具体到每一层,左侧空格数与符号数都与本层所在层号之间有关系。