本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
思路:求出n所能形成的最大沙漏所需符号之和,后打印出来。
#include<stdio.h>
int main(){
int n,i,k,t,j,m,sum=0;
char c;
scanf("%d %c",&n,&c); //读入n和符号
for(i=1;i<=47;i=i+2){ //利用等差数列求和公式可知,只需24行,上沙漏之和(包括1)就超 //过500(所给正整数不超过1000),第24项,由等差数列公式可知,第24项为47个,所以i<=47;
sum+=i*2;
if(n<=sum-1){ //sum-1,最长一行为i的沙漏符号总数,即n所能形成的最大沙漏数//的和。(sum-1为上沙漏之和计算sum的时候多加了一个1,故减去。)
if(n==sum-1) //n刚好等于sum-1
{
k=i;//最长一行符号数i赋值给k;
t=0;//没有剩余符号,t记为0
break;
}
else{ //不相等,即有剩余
k=i-2; //则最长一行符号数为i-2
t=n-(sum-(i*2))+1;//剩余符号数,即n减去i-2形成的沙漏符号数和
break;
}
}
}
for(i=k;i>=1;i=i-2){ //打印上沙漏
for(m=(k-i)/2-1;m>=0;m--){ //打印沙漏前空格
printf(" ");
}
for(j=i;j>0;j--){ //符号
printf("%c",c);
}
printf("\n"); //换行
}
for(i=3;i<=k;i=i+2){ //打印下沙漏
for(m=(k-i)/2-1;m>=0;m--){ //空格
printf(" ");
}
for(j=1;j<=i;j++){ //符号
printf("%c",c);
}
printf("\n"); //换行
}
printf("%d\n",t);
return 0;
}