被这个问题困扰了很久,还是咨询了别的大佬之后才做出来的
#include<stdio.h>
int main()
{
int a,c=0,d=1,i,j,k;
char b;
scanf("%d%c",&a,&b);
if(a==1)
printf("%c\n",b) ;
else
{
// 沙漏是上下对称的,我们单独取沙漏的下半部分来看,从第二层开始,沙漏每增加一层,根据其每层字符总数的变化:a1=3,a2=5,a3=7,a4=9,a5=…易得公式等差数列an=2n+1;等差数列的前n项和公式:Sn=(a1+an)(n/2),联立an得出Sn=n(n+2);算上沙漏的上下对称的两个部分加上对称层只有一个字符,故n层沙漏的总字符数为 S(n-1)+S(n-1)+1=2n^2-1
int n = 0;//上层多少行
for (int i = 1; i < N; i++) {
if ((2 * i * (i + 2) + 1) > N)
{
n = i ;
break;
}
}
//倒三角模板
for(i=1;i<=n;i++)//每一行都是先打印空格
{
for(j=1;j<=i-1;j++)//空格
printf(" ");
for(k=1;k<=2*(n-i)+1;k++)//字符数
printf("%c",b);
printf("\n");
}
//正三角模板
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-1-i;j++)
printf(" ");
for(k=1;k<=2*(i+1)-1;k++)
printf("%c",b);
printf("\n");
}
//最上面判断的是刚好不符合的时候,所以会多出一位 要把n变为n-1;
printf("%d",a-(2*(n-1)*(n-1+2)+1));
return 0;
}
}
希望对大家有帮助!