赞
踩
输入在一行给出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;
小白编程,写得真的太丑了。不过我的宗旨是:我和程序有一个能跑就行。未来再优化优化吧
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。