1027 打印沙漏 (20 分)
分析:这道题虽然只有20分,但其复杂程度不亚于25的题目。其中有个坑点就是只有左边有空格,右边不能打印空格,打印会有一个测试点过不了。
思路:首先利用数学等差数列前n项和确定要打印的行数,然后要知道每行的空格的规律(0,1,2,3…)和每行打印的字符的规律;
然后我把这个沙漏分成两个部分来打印
我是先输出了上面的一个完整的三角形,然后又输出了有缺口的下边的三角形。
代码如下:
int main()
{
char ch;
int i,j,k,n,row=1,t;
scanf("%d %c",&n,&ch);
while(true)
{
if((2*row*row-1<=n)&&(2*(row+1)*(row+1)-1>n))
break;
else
row++;//找出需要打印的行数的一半(带缺角)
}
t=row;
for(i=0;i<row;i++)//打印上边三角形部分
{
k=i;
while(k--)
printf(" ");//打印每行左边的空格
for(j=0;j<2*t-1;j++)
printf("%c",ch);//打印每行的符号
printf("\n");
t--;
}
i-=2;
t=2;
for(i;i>=0;i--)//打印缺角的下边三角形
{
k=i;
while(k--)
printf(" ");//打印空格
for(j=0;j<2*t-1;j++)
printf("%c",ch);//打印的字符
printf("\n");
t++;
}
t=n-2*row*row+1;//最后求出还剩多少个,最后求这个东西有个好处就是你可以用过的变量,不会影响。
printf("%d",t);
}