自测-1 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
结尾无空行
输出样例:
*****
***
*
***
*****
2
结尾无空行
PTA菜鸟正式开始写博客的第一条
解题思路:这种解法算是暴力算法,首先通过对输入的整数进行计算得出所需要输出的行数,然后通过将整个沙漏分成上下俩个部分进行分别的输出,在将中间的特殊点进行输出时,我将其归在了上三角的输出之中,在学习了大牛的解法之后,发现在上下对称的半部分的中间进行插入输出可能效果会更好,在此写下自己的菜鸡代码,也算记录接下来要走的道路。
//先打印上面的三角然后打印下面的三角,首先需要确定整个三角的行数
#include<iostream>
using namespace std;
int main(void)
{
int hang = 1;//默认行数从第二行开始吧,还有没有掉的符号这样的一个东西
int number = 0;
char character;
cin >> number;
cin >> character;
if(number == 0)
{
cout << number <<endl;
return 0;
}
if (number == 1)
{
cout << character << endl;
cout << "0"<<endl;
return 0;
}
int i = 2;
number = number - 1;
while (((2 * i - 1) * 2) <= number)
{
number = number - ((2 * i - 1) * 2);
hang = hang + 2;
i++;
}//先输出上三角的情况
int size = (hang + 1) / 2;//到这里没有任何的问题
for (int j = 0; j < size; ++j)
{
for (int z = j; z > 0; --z)
{
cout << " ";
}
for (int q = 0; q < hang -(j * 2); ++q)
{
cout << character;
}
cout << endl;
}//到这里上三角解决了
//从此处开始解决下三角
for (int j = 1; j < size; ++j)
{
for (int z = hang / 2 - j; z > 0; --z)
{
cout << " ";
}
for (int q = 2 * j + 1; q>0; --q)
{
cout << character;
}
cout << endl;
}
cout << number ;
cout << endl;
return 0;
}