我把这个沙漏呢分成3部分,中间一点,上下两部分,当然上下两部分是一样的,可以当成等差数列,由3开始,5,7,9,
这道题,主要是1,求一共几列,2,打印。
设置n,n为上面部分的列数,由等差数列的最上面是(2*n+1),而上面部分的总个数为Sn=(3+(2*n+1))*n/2,沙漏的总个数为2*Sn+1, 为了求n,可以列式
2*Sn+1<N;
2*S(n+1)+1>N;
得到n,
打印部分就是关键在于计算空格个数,和字符个数;以下就是我的代码啦,其实我还是觉得有些繁琐
!!!这有一个很关键的问题!!!沙漏后面的空格,他没说,不用填,不然就是错误啦!!!
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int N;
int n=0,i,j;
char x;
scanf("%d %c",&N,&x);
while((( 3+(2*n+1))*n +2*(2*(n+1) +1) ) <(N-1))
{
n++;
}
for(i=0;i<=n;i++)
{
for(j=0;j<i;j++)
printf(" ");
for(j=0;j<2*n+1-2*i;j++)
printf("%c",x);
printf("\n");
}
for(i=n-1;i>=0;i--)
{
for(j=0;j<i;j++)
printf(" ");
for(j=0;j<2*n+1-2*i;j++)
printf("%c",x);
printf("\n");
}
printf("%d",N-((3+(2*n+1))*n+1));
return 0;
}