题目要求:
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
解题思路:
这道题的重点就在于找到第一行可输入的符号个数的最大值,剩下的就是打印操作。
如何找到这个最大值x呢?观察例题中上半部分沙漏的个数(除开中间的一个*),总共有8个,关于中间的*对称,打印该沙漏至少需要8*2+1=17<19个,满足。若第一行有7个,则至少需要15*2+1=31个,越界。所以,当第一行数量为5时,能够尽可能使用完所给的 * 从而组成完整的沙漏。
打印沙漏的过程太麻烦了,一直调试找了好多次bug终于解决了。
代码:
int n, s = 0, x = 3, lev, num = 0;
char l;
cin >> n;//输入所给的符号数量
cin >> l;//输入符号
while (2 * s + 1 <= n) //循环,找到临界s、x。看不懂可以代题目中的值算一下
{
s = s + x;
x = x + 2;
num++;
}
s = s - x + 2;
x = x - 4;//第一行输出最大的符号数
lev = n - s * 2 - 1;//多余的符号数量
static int j=x;
for (int i = 0; i < num - 1; i++) //num-1相当于上半截沙漏的行数(不包括中间*单独的一行)
{
int e = i;
while (e)
{
cout << " ";
e--;
}
int k = j;
for (k; k > 0; k -= 1)
{
cout << l;
}
cout << endl;
j -= 2;
}
//**********************************
//单独打印中间的一行
for (int i = 0; i < num-1; i++)
{
cout << " ";
}
cout << l << endl;
//*********************************
//j因为上面最后减了2,现在变成1了,加上2,从3开始打印
//下面和上面方法差不多,注意打印空格和符号方式有区别
j += 2;
int num1 = num - 2;
for (int i = 0; i < num - 1; i++)
{
int k = j;
int e = num1;
while (e)
{
cout << " ";
e--;
}
for (k; k > 0; k--)
{
cout << l;
}
cout << endl;
j += 2;
num1--;
}
cout << lev;
小白编程,写得真的太丑了。不过我的宗旨是:我和程序有一个能跑就行。未来再优化优化吧