題目:
把給定的符號打印成沙漏的形狀。例如給定17個“*”,要求按下列格式打印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等。
給定任意N個符號,不一定能正好組成一個沙漏。要求打印出的沙漏能用掉儘可能多的符號。
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔。
輸出格式:
首先打印出由給定符號組成的最大的沙漏形狀,最後在一行中輸出剩下沒用掉的符號數。
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
思路:
首先去除中間一行的一個“”,然後開始計算,從中間到兩邊(一邊爲例,最後直接 2),從1開始編號,不難看出,行和“”個數的式子: 然後用一個變量sum計算當前的“*”數量,判斷是否 輸入的n,最後打印出沙漏和 即可。
AC代碼:
#include <iostream>
using namespace std;
int main(void)
{
int n, i = 1, sum = 1; //i爲上半部分(或下半部分)層數,sum爲一共打印的個數
char c;
cout << "請輸入一個數字和一個字符:";
cin >> n >> c;
while (sum <= n)
{
sum += 2 * (2 * (i + 1) - 1); //2n-1是一層的個數,乘以2代表兩層一共需要的
if (sum <= n)
i++;
}
for (int j = 0; j < i; j++) //打印上半部分
{
for (int k = 0; k < j; k++)
cout << " "; //打印j-1個空格
for (int k = 0; k < 2 * (i - j) - 1; k++)
cout << c; //打印2*(i-j-1)-1個符號
cout << endl; //打印完一行換行
}
for (int j = 2; j <= i; j++) //打印下半部分
{
for (int k = 0; k < i - j; k++)
cout << " "; //打印i-j個空格
for (int k = 0; k < 2 * j - 1; k++)
cout << c; //打印2*j-1個符號
cout << endl; //打印完一行換行
}
cout << n - (sum - 2 * (2 * (i + 1) - 1));
return 0;
}