PTA 乙级 1027 打印沙漏 (20分) C/C++

 

 需要找规律确定最大的沙漏形状,将沙漏分为两部分看

 

 上半部分比下半部分多一个符号,所以 总符号数 = 2*上半部分符号数 - 1

 

上半部分符号数 = (项数 * (1 + 一行中输出最多的符号数))/ 2

找到最终关系: 总符号数 = 2 * 项数^2 - 1(2n^2 - 1) 

通过这个关系可以找到最大沙漏形状

注意:

  • 测试点0、3,在符号后不可输出空格,应直接换行
  • 测试点1,输入为1时的输出结果错误

放代码:

C++

 

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     /*输入正整数*/
 7     int n = 0;
 8     /*总行数*/
 9     int sl = 0;
10     /*位于n前面和后面所需符号数*/
11     int n1, n2;
12     /*输入的符号*/
13     char w;
14     cin >> n >> w;
15     for (int i = 0;; i++) {
16         n1 = 2 * (i * i) - 1;                //n之前形成沙漏形状所需要的符号数
17         n2 = 2 * ((i + 1) * (i + 1)) - 1;    //n之后形成沙漏形状所需要的符号数
18         if (n >= n1 && n < n2) {
19             sl = 2 * i - 1;                    //第一行输出的符号数(总行数)
20             break;
21         }
22     }
23     int c = sl;                                //用于计算每行所需要的输出的符号
24     int flag = 1;                            //空格输出个数累加/减标志位
25     for (int i = 0; i < sl; i++) {
26         for (int j = 0; j < (sl - c) / 2; j++)cout << ' '; //只有符号前用输出空格,符号之后没有空格
27         for (int j = 0; j < c; j++) cout << w;
28         if (flag) c -= 2; else c += 2;
29         if (c == 1)flag = 0;
30         cout <<  endl;
31     }
32     cout << n - n1;                //剩余没用的符号数
33     return 0;
34 }

 

挺有意思的一个题

 

posted @ 2020-07-14 01:59  上帝的绵羊  阅读(571)  评论(0编辑  收藏  举报