PAT_B_1027 打印沙漏

题目描述:spa

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

*****
 ***
  *
 ***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不必定能正好组成一个沙漏。要求打印出的沙漏能用掉尽量多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
 ***
  *
 ***
*****
2

本人AC代码:blog

//  PAT_1027_Print

# include <stdio.h>
# include <math.h>

int main(void)
{
	int number;
	char ch;
	int min=1, max;
	int i, j, k;
	int left;
	int val;
	
	scanf("%d %c",&number,&ch);
	
	if (number < 7)
	{
		printf ("%c\n%d",ch,number-1);
		return 0;
	}
	
	// 用数学公式获得打印的单侧行数 K 
	k = (int)sqrt(2*number + 2) - 1;
	left = number - ((k+1)*(k+1)-2)/2; 
	k /= 2;
	
	 //  打印沙漏 由大到小 
	 for (i=k; i>=0; i--) 
	 {
	 	//  每层有多少个* 
	 	val = (2*i+1);
	 	for (j=0; j<k-i; j++)
	 		printf(" ");
	 	for (j=0; j<val; j++)
	 	{
	 		printf("%c",ch);
		 }
		 printf("\n");
	 }
	 //  打印沙漏 由小到大 
	  for (i=1; i<=k; i++) 
	 {
	 	//  每层有多少个* 
	 	val = (2*i+1);
	 	for (j=0; j<k-i; j++)
	 		printf(" ");
	 	for (j=0; j<val; j++)
	 	{
	 		printf("%c",ch);
		 }
		 printf("\n");
	 }
	 printf("%d",left);
	
	return 0;
}

RRR数学

相关文章
相关标签/搜索