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;
}
来源:https://blog.csdn.net/weixin_43143173/article/details/99460296