【pat】打印沙漏(详细解释)

本题要求你写个程序把给定的符号打印成沙漏的形状。

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

在这里给出一组输入。例如:

输出样例:

在这里给出相应的输出。例如:

思路:
是有点数学的想法在里面的。(话说高考完选志愿,就听说学计算机要数学好,确实有时候需要一些数学,但毕竟不是数学专业,也不一定非得数学很好,好像我们专业之前和数学专业是一个学院,后来分开了哈哈哈题外话题外话)

1. 把最中间的1先算做上半部分,一共是n个,一半就是n/2,那我们的一半的行数怎么求呢,嘿嘿就用到了我们的奇数求和公式:[1+(2*line-1)]*line/2——化简——》line*line=n/2 line=(int)sqrt(n/2),不一定是完全平方数,前面强制为int。
2. 上半部分是倒着的i=[line,1], j=[line-i,0)来控制空格输出,k=[2i-1,0)来控制字符输出;
3. 下半部分正着的(因为最中间算上半部分了,所以少一行)i=[2,line] 因为对称的,空格和字符输出和上半部分一样。
4. 用了多少呢?用掉的=上半部分+下半部分=上半部分+上半部分-1=2*line*line-1,剩余的=n-用掉的

AC:

猜你喜欢

转载自blog.csdn.net/m0_62504956/article/details/128615414