L1-002 打印沙漏
题目描述:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
样例输出:
思路分析:
这道题可以看出是一个对称问题求解,而且是从1,3,5,到2n-1,的规律递增,那么可以很容易计算每一层所需要的字符,然后是层数,该层数有不同的求解思路,所以在代码中会有解释。废话不多说,直接上代码。
代码:
#include<stdio.h>
int main()
{
int a,b,c=0,d=0,m,n,sum=0;
char c1;
scanf("%d %c",&a,&c1);
b=(a-1)/2;//求出上半部分的总字符量
while(1)//这一步是要计算层数。
{
c=d*d+2*d;//这里是以等差中的Sn去求层数相当于是n(n-1)/2,b是上层的总字符量,相当于Sn
//所以直接套公式即可得出n(层数)
if(c>b)
{
d-=1;
break;
}
d++;
}
m=2*d+1;//计算上层数
for(d=m;d>=1;d-=2)//输出上层层数
{
for(n=m-d;n>0;n-=2)//输出外层空格
{
printf(" ");
}
for(c=d;c>0;c--)//输出字符
{
printf("%c",c1);
sum++;
}
printf("\n");
}
for(d=3;d<=m;d+=2)//输出下层层数。
{
for(n=0;n<m-d;n+=2)//输出外层空格
{
printf(" ");
}
for(c=0;c<d;c++)//输出字符
{
printf("%c",c1);
sum++;
}
printf("\n");
}
printf("%d",a-sum);//输出所剩的数
}
总结:
这道题的思路依然是先求出上半部分,找出其中规律,在用对称法,求出下半部分即可。如果有兴趣的同学,下面给出该题的链接。