本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
#include <stdio.h>
int top_num(int e){
int n =1;
int i = 1;
while(n <e){
i+=2;
n+=i;
}
return i; //i为顶部*数量
}
void PrintOut(int n,char ch){
//n个*输出⏳
int TopSize = top_num((n+1)/2); //顶部*的数量
int k = TopSize;
while(k>1){ //打印上三角不包括中间一个
for(int i = 0;i <(TopSize-k)/2;i++){ //打印一行空格
printf(" ");
}
for(int i =0;i < k;i++){
printf("%c",ch);
}
putchar('\n');
k-=2;
}//k==1;
for(int i = 0;i <(TopSize-1)/2;i++){
printf(" ");
}
printf("%c\n",ch);
k+=2;
while(k<=TopSize){
for(int i = 0;i <(TopSize-k)/2;i++){ //打印一行空格
printf(" ");
}
for(int i =0;i <k;i++){
printf("%c",ch);
}
putchar('\n');
k+=2;
}
}
int main(void){
int array[500]; //array[记录可以组成沙漏的的*号数情况]
//为计算符号数而准备的变量
int n = 1;
int i = 0; //i保存情况个数
int j = 3;
array[i++] = 1;
while(n <=1000){ //n为*号数,不大于一千则循环
n = n+j*2;
j+=2;
array[i++] = n;
}
//获取输入
int num;
char ch;
scanf("%d %c",&num,&ch);
//
i = 0;
while(array[i]<=num)i++; //退出条件为array[i]>num
i-=1;
PrintOut(array[i],ch); //输出沙漏
// if(num-array[i]!=0)
printf("%d\n",num-array[i]); //输出剩余
return 0;
}
//写到最后才发现并不一定是*号,所以在打印沙漏的函数又加了一个变量。