PAT 1027 打印沙漏

PAT 1027 打印沙漏_第1张图片


毕竟第一篇博客,写点简单的题来练练手。

先分析一下这题的解题思路,首先肯定是要确定好沙漏有什么元素,可以看出每行都是等差数列2n-1,总元素数是(1+2n-1)*n/2-1=n2-1个

漏斗的元素个数确定的话,最后剩余的个数就用总数量减去n2-1个

但是如何确定这个n的值呢?

这里采用一个技巧:

           因为余下来的数必定是用来凑小数位的,所以余数的作用充其量就是个弥补小数位的作用

          这样的话就可以把总个数看成两部分,一部分是由做漏斗的那部分起主要作用的整数部分,还有另一部分就是余数和n2-1中的1组成的小数位部分

           于是有关系式      n(余数)+n2-1=N(总数量)

           所以 如果对浮点数   N+1强制转化为整数的话,那么n(余数)的作用将被抹杀掉,被忽视掉。

           从而忽略了次要影响因素从而确定了n的取值。


下面附上代码:


  1. #include  
  2. #include  
  3.   
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     int N;  
  9.     char c;  
  10.     cin >> N >> c;  
  11.     int k = sqrt((N + 1) / 2);  
  12.     for (int i = 1; i <= k; i++)  
  13.     {   
  14.         for (int j = 1; j < i; j++)  
  15.         {  
  16.           cout << " ";  
  17.         }  
  18.         for (int j = 2*(k - i) + 1; j >= 1; j--)  
  19.         {  
  20.           cout << c;  
  21.         }  
  22.         cout << endl;  
  23.     }  
  24.     //输出漏斗的上半部分
  25.     for (int i = 1; i <= k - 1; i++)  
  26.     {  
  27.         for (int j = 1; j <= k - i - 1; j++)  
  28.         {  
  29.           cout << " ";  
  30.         }  
  31.         for (int j = 1; j <= 2 * i + 1; j++)  
  32.         {  
  33.           cout << c;  
  34.         }  
  35.         cout << endl;  
  36.     }  
  37.     cout << N + 1 - 2 * k*k << endl;  
  38.     return 0;  
  39. }  






你可能感兴趣的:(------题解------)