意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

PAT 乙级 1027  打印沙漏

来源:恒创科技 编辑:恒创科技编辑部
2024-01-09 17:44:59


1027打印沙漏(20 point(s))

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印


PAT 乙级 1027  打印沙漏

*****
***
*
***
*****

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

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

输入格式:

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

输出格式:

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

输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
经验总结:

这一题,主要的点就是弄清楚规律,即符号个数N和上三角形行数C之间的关系,很容易可以推算出N=2*C*C-1,之后控制一下输出就可以啦,上面的倒三角和下面的正三角的输出是反过来的,还有,要注意一点,千万不要强迫症,空格只要输出左边的就行了,符号右边的不要输出!否则会有两个测试点通不过,博主自身的血的教训T-T(代码里注释掉的就是多加的空格)

AC代码
#include <cstdio>
#include <cmath>

int main()
{
int n;
char a;
while(~scanf("%d %c",&n,&a))
{
if(n<=0||n>1000)
break;
int x=(int)sqrt((n+1)/2.0);
for(int i=0;i<x;++i)
{
for(int j=0;j<i;++j)
printf(" ");
for(int j=0;j<2*(x-i)-1;++j)
{
printf("%c",a);
}
/*for(int j=0;j<i;++j)
printf(" ");*/
printf("\n");
}
for(int i=x-2;i>=0;--i)
{
for(int j=0;j<i;++j)
printf(" ");
for(int j=0;j<2*(x-i)-1;++j)
{
printf("%c",a);
}
/*for(int j=0;j<i;++j)
printf(" ");*/
printf("\n");
}
printf("%d\n",n-2*x*x+1);
}
return 0;
}

上一篇: PAT 甲级 1056  Mice and Rice 下一篇: 手机怎么远程登录云服务器?