奇数等差数列求和公式为S=n^2;沙漏上下对称,可先求上半部分的字符(即为a,但a要先加1再除2)最多可以打印几行(即求b),且最中间那行是共用的,所以沙漏的总字符数为2*(n^2)-1。
#include<stdio.h>
#include<math.h>
int main()
{
int n;
char ch;
scanf("%d %c",&n,&ch);
int a=(n+1)/2;
int b=sqrt(a); //b为最多可以打印的行数(沙漏的上半部分)
int c=n-2*b*b+1;//c为剩余的字符数
if(b==0 || n==0)
{
c=0;
}else if(n>0){
int flag=0;
for(int i=b;i>=1;i--)
{
int num=flag;
while(num!=0)
{
printf(" ");
num--;
}
for(int k=1;k<=2*i-1;k++)
printf("%c",ch);
printf("\n");
flag++;
}
for(int i=2;i<=b;i++)
{
int num=flag-2;
while(num!=0)
{
printf(" ");
num--;
}
for(int k=1;k<=2*i-1;k++)
{
printf("%c",ch);
}
printf("\n");
flag--;
}
}
printf("%d",c);
return 0;
}