题目:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
代码:
#include<stdio.h>
int main(){
int n;
char m;
scanf("%d %c",&n,&m);
int sum = 1;
int a;
if(n>=7){
for(int i = 3; ; i+=2){
sum += 2*i; //不算中间为1的符号,从3开始
if(sum>n){
break;
}
a = sum; //一共用a个符号打印
}
int b = (a-1)/2;
int c = 0;
int i = 3;
while(1){
c+=i;
if(c==b){
break;
}
i+=2; //i为打印最大一行所用符号
}
int x = i,y = i;
int k = 0;
while(x>0){
for(int j = 0;j<k;j++){
printf(" ");
}
for(int j = 0;j<x;j++){
printf("%c",m);
}
printf("\n");
x-=2;
k++; //每打印完一行就多一个空格
}
int z = 3; //从1个之后开始打印,知道达到最大符号数结束;
k-=2; //因为下面的三角从以一个符号为标准的上一个开始,所以k的最大值减2
while(z<=y){
for(int j = 0;j<k;j++){
printf(" ");
}
for(int i = 0;i<z;i++){
printf("%c",m);
}
printf("\n");
z+=2;
k--;
}
int cnt = n-a;
printf("%d",cnt);
}
if(n<7){
if(n>0){
printf("%c\n",m);
printf("%d",n-1);
}
if(n == 0){
printf("1");
}
}
return 0;
}
思路:
首先想到的是怎么能按照等差数列打印三角,于是推断出来了形成一个沙漏所需要的符号个数,再按照1,3,5,7,9…推出了一行里最大打印的符号个数,从上面的三角开始打印,直到一个符号为止,下面的三角从3开始,因为沙漏形成的条件,最少所需为7,一行最少为3,所以从3开始以此递增加2,上面的三角从最大的开始以此递减2。