机试算法讲解: 第7题 打印一个梯形吧

/*
问题:输入高度h,输出高为h,上底边围h的梯形
      ------------
     --------------
    ----------------
   ------------------
  --------------------
思路:
由于多出的底边x可以设为任意值,不放设x=h
第1行,    h         h
第2行,打印h-1个空格,1个*,然后打印h个空格,再打印1个*                            h+2*1
  3         h-2       1            h+2*1         1个*                           h+2*2
  4         h-3个空格,1个*         h+2*2         1个*
  h-1       2         ,1个*        h+2*(h-1-2)个空格,即h+2*(h-3),1个*
  i         h+1-i      1个*        h+2*(i-2)个空格,1个*                        h+2*(i-1)
  h         1个空格  ,3h个*
打印第一行时,先打印h个空格,再打印h个*号,
然后打印h个换行符
最后打印长度为2h个的*号


总结公式:
print(*)= {h个空格,h个*,i=1
          {1个空格,3h个*,i=h 错,是3h-2个*,因为,h最后一行有2个*公用了
		  {h+1-i个空格,1个*,h+2*(i-2)个空格,1个*
*/




//等腰梯形
/*
#include <stdio.h>
#include <stdlib.h>


int main(int argc,char* argv[])
{
	int h,i;
	while(EOF!=scanf("%d",&h) && h >= 1 && h <= 1000)
	{
		int iLinNum = 1;
		while(iLinNum <= h)
		{
			if(iLinNum > 1 && iLinNum < h)
			{
				for(i = 1;i <= (h+1-iLinNum) ; i++)
				{
					printf("%c",' ');
				}
				/*
				printf("%c",'*');
				for(i = 1; i <= (h+2*(iLinNum-2)) ; i++)
				{
					printf("%c",' ');
				}
				printf("%c",'*');
				*/
/*
				for(i = 1;i <= (h+2*(iLinNum-1)) ; i++)
				{
					printf("%c",'*');
				}
				printf("\n");
				iLinNum++;
			}
			else if(1==iLinNum)
			{
				for(i = 1 ; i <= h ; i++ )
				{
					printf("%c",' ');
				}
				for(i = 1 ; i <= h ; i++ )
				{
					printf("%c",'*');
				}
				printf("\n");
				iLinNum++;
			}
			else if(h==iLinNum)
			{
				printf("%c",' ');
				for(i = 1;i <= 3*h - 2 ; i++)
				{
					printf("%c",'*');
				}
				printf("\n");
				iLinNum++;
			}//else if
		}//while
	}//while
	system("pause");
	getchar();
	return 0;
}
*/


/*
样例输入:4
输出:
      ****
    ******
  ********
**********
公式:
第一行h个*,前面空 h+2*(h-1)-h个空格=  2*(h-1)个空格
 二   h+2个*
 i    h+2*(i-1)个*,前面空 h+2*(h-1)-[h+2*(i-1)] = 2*(h-i)个空格
 h    h+2*(h-1)个*


print(*) = {2*(h-i)个空格,h+2*(i-1)个*,第i行
*/
#include <stdio.h>
#include <stdlib.h>


int main(int argc,char* argv[])
{
	int h,i;
	while(EOF!=scanf("%d",&h) && h >= 1 && h <= 1000)
	{
		int iLinNum = 1;
		while(iLinNum <= h)
		{
			for(i = 1 ; i <= 2*(h-iLinNum); i++)
			{
				printf("%c",' ');
			}
			for(i = 1; i <= h+2*(iLinNum-1) ; i++)
			{
				printf("%c",'*');
			}
			iLinNum++;
			printf("\n");
		}
	}
	system("pause");
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值