1027 打印沙漏 (20 分)C++ PAT (Basic Level) Practice

喜你入骨 提交于 2019-11-27 05:47:42

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

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

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

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

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

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

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

PAT通过代码

//1027 打印沙漏 (20 分)

#include<stdio.h> 
#include<math.h>
int N;
int firstColsCharNum;
int firstColsNum(int sum){//firstColsNum()为计算首行的*号个数 	
	int n;
	for(int i=sqrt(sum);i<sum;i++){	//用sqrt()防超时 
		//i为行数 
		n=i*1+i*(i-1);
		if(n>sum){//此时n超过sum,i要-1 
			return (i-1-1)*2+1;//返回首行的*号数 
			/*
				*****
				 *** //此行为i-1-1行,
				  *  //此行为i-1行,舍去此行 ,方便对称打印 
				 ***
				*****
			*/
		}
	}
}
void dt(int num,char c){
	int spacenum=(firstColsCharNum-num)/2;//空格数 
	if(num<=1){//结束标志//num<=1表示:去掉只有1个*的那一行 
		//打印只有1个*的那一行
		for(int i=0;i<spacenum;i++)printf(" ");//打印空格 
		printf("%c\n",c);//打印一个* 
		N--;//余数-1
		//打印只有1个*的那一行
		return ;//递归返回 
	}
	
//递归正向打印 
	for(int i=0;i<spacenum;i++)printf(" ");//打印空格 
	for(int i=0;i<num;i++)printf("%c",c);//打印* 
	printf("\n");
	N-=num;//余数-=num
	
	dt(num-2,c);//递归 
	
//递归返回反向打印 
	for(int i=0;i<spacenum;i++)printf(" ");//打印空格 
	for(int i=0;i<num;i++)printf("%c",c);//打印* 
	printf("\n");
	N-=num;//余数-=num
}

int main(){
	char c;
	scanf("%d %c",&N,&c);
	if(N>0){
		firstColsCharNum=firstColsNum((N+1)/2);//space为第一行的*号数  
		dt(firstColsCharNum,c);
	}
	printf("%d",N);//输出余数 
	return 0;
}


	

//1027 打印沙漏 (20 分)
#include<stdio.h> 
#include<math.h>
int N;
int firstColsCharNum;
int firstColsNum(int sum){
	int n;
	for(int i=sqrt(sum);i<sum;i++){	
		n=i*1+i*(i-1);
		if(n>sum){
			return (i-1-1)*2+1;
		}
	}
}
void dt(int num,char c){
	int spacenum=(firstColsCharNum-num)/2;
	if(num<=1){
		for(int i=0;i<spacenum;i++)printf(" ");
		printf("%c\n",c);
		N--;
		return ;
	}
	for(int i=0;i<spacenum;i++)printf(" ");
	for(int i=0;i<num;i++)printf("%c",c);
	printf("\n");
	N-=num;
	dt(num-2,c);
	for(int i=0;i<spacenum;i++)printf(" ");
	for(int i=0;i<num;i++)printf("%c",c);
	printf("\n");
	N-=num;
}
int main(){
	char c;
	scanf("%d %c",&N,&c);
	if(N>0){
		firstColsCharNum=firstColsNum((N+1)/2);
		dt(firstColsCharNum,c);
	}
	printf("%d",N);
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!