本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤\le≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
解答程序:
#include<stdio.h>
#define a (2*i*i-1) //每层沙漏所需符号数;
#define y (2*i-1)
void output1(int i,char c); //打印上半部分沙漏包括最后一个点
void output2(int i,char c); //打印下半部分,不包括最后一个点
int main()
{
int N,value,i=1;
char c;
scanf("%d %c",&N,&c);
while(N>=a) {
i++;
}
i--; //共有多少层
value=N-a; //多余的符号数目
output1(i,c);
printf("%d\n",value);
return 0;
}
void output1(int i,char c)
{
int j=i;
int s,x; // x表示为每一层打印的次数
if(i==1) {
printf("%c\n",c); // i为1的时候就只在这里结束,不用执行打印下半部分的函数 output2();
return ;
}
else for(x=1;x<=y;x++) { //每一层都输出 y个字符;
printf("%c",c);
if(i==1) break;
if(x==y) {
printf("\n");
x=0; //因为有x++;
i--;
if(j!=i) { // 如果j!=i则在这层 输出j-i个空格
for(s=1;s<=j-i;s++)
printf(" ");
}
}
}
printf("\n");
output2(j,c); //因为i的值在这个函数被改变了,虽然main函数中没有变化;
}
void output2(int i,char c)
{
int j=i;
int s,x;
int z=2; //因为下半部分是从第2层开始计数的
for(x=2*z-1;x>=1;x--) { //每一层输出2*z-1,z表示层数
if(x==2*z-1) { //每次打印时,比较跟底层i的值,就打印多少个空格 ,空格数跟差值有关
if(j!=z) {
for(s=1;s<=j-z;s++)
printf(" ");
}
}
printf("%c",c);
if(x==1) { // x==1表示,该层数打印完了,就换下一行,
printf("\n");
z++;
x=2*z; //因为有 x--;
}
if(z>i) break; //当z表示的层数大于最大层数i的时候退出循环,打印完成
}
}