PTA 1027 打印沙漏 (c语言+分析+思路)

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给个选择

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值