PTA天梯赛------L1-002 打印沙漏

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

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

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

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

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

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

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

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

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

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

#include <stdio.h>

int main(void)
{
//*****
// ***
//  *
// ***
//*****
//沙漏拆两半,上面一半1 3 5 7  等差数列为:1 + (n-1)2 d为2 a1为1 
//沙漏拆两半,下面一半3 5 7 9  等差数列为:3 + (n-1)2 d为2 a1为3 
//输入一个数,定义一个变量和符号 
	int n; 
	char fh; 
	scanf("%d %c",&n,&fh);
//
//求出沙漏上下之和不大于这个数的个数,先分别数列求和 
//sn1 + sn2 < n 
//循环遍历求出这个n是几
//定义沙漏行数从1开始 
	int hs = 1;
//上三角数列和 
	int sn1 = 0;
//下三角数列和 
	int sn2 = 0;
//判断和不大于输入的值 n 
	while(sn1 + sn2 < n)
	{
//数列求和公式 
		sn1 += 1 + (hs-1)*2;
		sn2 += 3 + (hs-1)*2;
//增加行数 
		hs++;	
	}     
	//printf("%d\n",hs); 
	//3+6+6+2==17     
//循环里会多增加一次循环,要减掉 
	hs-=1;
//判断画出的沙漏会不会多出给定值的范围 
	int num1 = (hs*1 + hs*(hs-1));
	int num2 = ((hs-1)*3 + (hs-1)*((hs-1)-1));   
//	printf("%d %d\n",num1,num2);
//判断画出的沙漏会不会多出给定值的范围 ,多的话就减去一行	
	if((num1+num2) > n)
	{
		hs--;
	}

//然后就可以循环遍历打印出沙漏了 
	int j,k,m;
	int kg = 0;
	int count = 0;
	for(j = hs ;j >= 1;j--)
	{
		for(m = 0;m < kg;m++)
		{
			printf(" ");
		}
		for(k =0;k < (1 + (j-1)*2) ;k++)
		{
			printf("%c",fh);
			count++;
		}
		kg++;
		printf("\n");
	}
	kg -= 2;
	for(j = 1;j<=hs-1;j++)
	{
		for(m = 0;m < kg;m++)
		{
			printf(" ");
		}
		for(k = 0;k < (3 + (j-1)*2) ;k++)
		{
			printf("%c",fh);
			count++;
		}
		kg--;
		printf("\n");
	}
	//计算出数量差 
	printf("%d",n-count);
	
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/makabaka12138/article/details/128781613