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 }
挺有意思的一个题
默默地一点点变强,细节决定成败