浙大 PTA 自测-1 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:

*****
 ***
  *
 ***
*****
2
#include 
#include 
int fact(int a)//判断输入的数字可以打印的最大沙漏
{
	int i=1,sum=1;
	if(a<7)
		return 1;//若输入的数字小于7只能打印一个符号
	if(a>=7)
	{
		i=3;
		while(1)
		{
			sum+=i*2;//sum代表构成沙漏所需的符号个数
			if(a<sum)
				break;//当输入的数字小于构成沙漏的符号时跳出循环
			i+=2;
		}
		return i-2;//返回沙漏的最大符号个数
	}
}
void print_ln(int x,char c)//打印沙漏
{
	int i=0,j=0,k=0,l=0;
	for(i=0;i<(x+1)/2;i++)//打印前一半沙漏
	{
		k=i;//记录行数:必须在第二个for循环前
		for(j=1;j<=x-i;j++)//打印该行
		{
			while(k>0)//打印空格:行数即空格数
			{
			    printf(" ");
				j++;
				k--;	
			}
			printf("%c",c);
		}
		printf("\n");//换行
	}
	for(i=(x/2)-1;i>=0;i--)//打印剩余沙漏
	{
		l=i;
		for(j=1;j<=x-i;j++)
		{
			while(l>0)//打印空格
			{
			    printf(" ");
				j++;
				l--;	
			}
			printf("%c",c);
		}
		printf("\n");
	}
}
int main(int argc, char *argv[]) 
{
	int a,x,sum=0,i;
	char c;
	scanf("%d %c",&a,&c);
	x=fact(a);
	print_ln(x,c);
	if(x==1)//只用到一个符号
		printf("%d",a-x);
	else
	{
		i=x;
		while(i>1)//计算打印沙漏用到的符号总数
		{
			sum+=i*2;
			i-=2;
		}
		printf("%d",a-sum-1);//输出剩余的符号个数
	}
	return 0;
}

你可能感兴趣的:(C)