PTA沙漏打印
思路:因为输出结果沙漏由x行组成,每一行又由元素空格与符号*组成,那么为输出完整沙漏,必然要借助于每一行空格与符号*的数量关系来逐行输出,因而:
本题的关键点在于:
一、.确定沙漏总行数与需要符号*数量的关系。这里我们可以观察到每一行符号*数量等差,(为2x- 1,x为从沙漏从中间开始向上或者向下的层数),我们先考虑上半部分,由等差数列公式可以等到上半部分符号*总量与行数的关系为(2x-1+1)*x/2=x^2。那么下半部分则是x^2-1。因而沙漏符号*总量与行数关系为2*x^2-1。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n, x, i, j;
char c;
cin >> n >> c;//输入符号数量与符号*
cout << endl;
//用等差公式计算行数(沙漏的上半部分行数)(此处等n是条件给的符号总数,并不一定是沙漏所需的符号总数,
//但由于取整操作,多余的符号会导致计算结果差异的小数部分会被舍弃,并不会影响我们计算行数)
x = (int)sqrt((n + 1) / 2);
//上半部分沙漏从上往下对行遍历
for (i = 1; i <=x ; i++) {
//空格与所处行关系
for (j = 0; j < i-1; j++)
cout << " ";
//符号与所处行关系
for (j=0;j<2*(x-i+1) - 1; j++)
cout << "*";
cout << endl;
}
//对下半部分从上往下遍历(没有了第一行)
for (i = 2; i <= x; i++) {
//空格与所处行关系
for (j=0;j<x-i;j++)
cout << " ";
//符号与所处行关系
for (j=0;j<2*i-1;j++)
cout << "*";
cout << endl;
}
cout << n - 2 * x * x + 1;//多余的符号数量
return 0;
}
二、找准每行空格数与符号数同该行的关系。通过对行的遍历来输出。