題目:1027 打印沙漏 (20 分)
本題要求你寫個程序把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印
***** *** * *** *****所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉盡可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最后在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *輸出樣例:
***** *** * *** ***** 2
思路:
- 等差數列求和問題,只要算出總個數與半個沙漏的層數關系即可,然后找空格的輸出規律就可實現代碼,好好想想並不難。
代碼:
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <sstream> 5 #include <cmath> 6 #include <algorithm> 7 #include <string> 8 #include <stack> 9 #include <queue> 10 #include <vector> 11 #include <map> 12 using namespace std; 13 14 int main() 15 { 16 int n, m, k; 17 char c; 18 scanf("%d %c", &n, &c); 19 k = sqrt((n+1) / 2); 20 m = n - (2 * k * k - 1); 21 for(int i = k; i > 0; i--) 22 { 23 if(k-i) 24 { 25 for(int j = 0; j < k-i; j++) 26 { 27 printf(" "); 28 } 29 } 30 for(int j = 0; j < 2*i-1; j++) 31 { 32 printf("%c", c); 33 } 34 printf("\n"); 35 } 36 for(int i = 2; i <= k; i++) 37 { 38 if(k-i) 39 { 40 for(int j = 0; j < k-i; j++) 41 { 42 printf(" "); 43 } 44 } 45 for(int j = 0; j < 2*i-1; j++) 46 { 47 printf("%c", c); 48 } 49 printf("\n"); 50 } 51 printf("%d\n", m); 52 return 0; 53 }
總結:
發現思維果然不如之前了,這題是三刷了,但是居然二刷時做的比現在好,怎么了這是?
最初k的計算我是為了不加括號分開算,結果測試點1錯了,調試發現是k的值有問題,想了下真是如此,計算機中用/號分開算與合起來算的結果可與自己算數不一樣……分開的話1/2是直接被當作0處理掉了,加上的機會都沒有。這個失誤……吃一塹長一智。不然可能注意不到。
