毕竟第一篇博客,写点简单的题来练练手。
先分析一下这题的解题思路,首先肯定是要确定好沙漏有什么元素,可以看出每行都是等差数列2n-1,总元素数是(1+2n-1)*n/2-1=n2-1个
漏斗的元素个数确定的话,最后剩余的个数就用总数量减去n2-1个
但是如何确定这个n的值呢?
这里采用一个技巧:
因为余下来的数必定是用来凑小数位的,所以余数的作用充其量就是个弥补小数位的作用
这样的话就可以把总个数看成两部分,一部分是由做漏斗的那部分起主要作用的整数部分,还有另一部分就是余数和n2-1中的1组成的小数位部分
于是有关系式 n(余数)+n2-1=N(总数量)
所以 如果对浮点数 N+1强制转化为整数的话,那么n(余数)的作用将被抹杀掉,被忽视掉。
从而忽略了次要影响因素从而确定了n的取值。
下面附上代码:
- #include<iostream>
- #include<cmath>
- using namespace std;
- int main()
- {
- int N;
- char c;
- cin >> N >> c;
- int k = sqrt((N + 1) / 2);
- for (int i = 1; i <= k; i++)
- {
- for (int j = 1; j < i; j++)
- {
- cout << " ";
- }
- for (int j = 2*(k - i) + 1; j >= 1; j--)
- {
- cout << c;
- }
- cout << endl;
- }
- //输出漏斗的上半部分
- for (int i = 1; i <= k - 1; i++)
- {
- for (int j = 1; j <= k - i - 1; j++)
- {
- cout << " ";
- }
- for (int j = 1; j <= 2 * i + 1; j++)
- {
- cout << c;
- }
- cout << endl;
- }
- cout << N + 1 - 2 * k*k << endl;
- return 0;
- }