/*
题目来源:Pat
L1-002. 打印沙漏
时间限制 400 ms
内存限制 65536 kB
代码长度限制 8000 B
判题程序 Standard
作者 陈越
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式(Input):
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式(Output):
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例(InputSample):
19 *
输出样例(OutputSample):
*****
***
*
***
*****
2
解题思路:
将沙漏分为主半沙漏(倒三角)和副半沙漏(除倒三角外部分)
*/
#include <iostream>
#include <cmath>
using namespace std;
/*
ch为符号
m为符号数 n为主半沙漏行数 i,j,k为循环变量 t为当前行符号个数
*/
int main()
{
char ch;
int n,m,i,j,k,t;
cin>>m>>ch;
n = (int)sqrt((m+1)/2); // 将输入的数转化为 半个沙漏行数(可形成三角的那部分半沙漏的行数) 有等差数列推导出
// 输出主半沙漏(倒三角部分)
for(i=1;i<=n;i++)
{ // middle 打印中间行(第n行,主半沙漏底部)
if(i==n)
{
for(j=1;j<=(i-1);j++) // i-1个前空格
cout<<" ";
cout<<ch<<endl; // 1个符号
break;
}
// up 打印 除主半沙漏底部 部分
t = 2*(n-(i-1))-1;
for(j=1;j<=(i-1);j++) // i-1个前空格
cout<<" ";
for(k=1;k<=t;k++) // 2*("n-(i-1)")-1个符号 (主要在于 n 的变化)
cout<<ch;
cout<<endl; // 换行
}
// 输出副半沙漏(无头正三角部分)
for(i=2;i<=n;i++) // down 因为各行符号数为2*n-1个,为了方便计算,从2开始
{
t = 2*i-1;
for(j=1;j<=((2*n-1)-t)/2;j++) // (最大符号数-当前行符号数)/2个前空格
cout<<" ";
for(k=1;k<=t;k++) // 2*i-1个符号
cout<<ch;
cout<<endl;
}
cout<<m-(2*n*n-1); // 剩余符号数
return 0;
}
Exercise(23):打印沙漏
最新推荐文章于 2022-04-12 20:57:53 发布
