題目描述:
本題要求你寫個程式把給定的符號列印成沙漏的形狀,例如給定17個“*”,要求按下列格式列印
*****
***
*
***
*****
所謂“沙漏形狀”,是指每行輸出奇數個符號;各行符號中心對齊;相鄰兩行符號數差2;符號數先從大到小順序遞減到1,再從小到大順序遞增;首尾符號數相等,
給定任意N個符號,不一定能正好組成一個沙漏,要求列印出的沙漏能用掉盡可能多的符號,
輸入格式:
輸入在一行給出1個正整數N(≤1000)和一個符號,中間以空格分隔,
輸出格式:
首先列印出由給定符號組成的最大的沙漏形狀,最后在一行中輸出剩下沒用掉的符號數,
輸入樣例:
19 *
輸出樣例:
*****
***
*
***
*****
2
解題思路:
? 此題要求我們列印一個沙漏,由觀察得:就是列印兩個等腰三角形,但是要求一正一反,并且有一個公用的頂點,
? 題目要求輸入一個整數n和一個符號,要求我們用該符號列印沙漏,但是符號的數量不超過n,
? 如果一個等腰三角形的高度為h,那么構成等腰三角形所需的符號的個數為h2,那么構成數字沙漏的符號的個數就是h2*2-1,(多了一個頂點)
? 我們可以用一個for回圈列舉可能的高度,再進行判斷是否符合條件,若高度為h,則所需的符號數量的最小值為2h2-1,最大值為2(h+1)2-2(若為2*(h+1)2-1則可以構成等腰三角形高度為h+1的數字沙漏),然后再分別輸出兩個等腰三角形,注意兩個等腰三角形有公共頂點,
代碼:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n, lef, high;
char arr;
cin >> n >> arr;
for (high = 1;; high++)
{
int min = 2 * high * high - 1;
int max = 2 * (high + 1) * (high + 1) - 2;
if (n >= min && n <= max)//判斷n是否符合構成數字沙漏的條件
{
lef = n - min;//求出剩余的符號個數
break;
}
}
for (int i = 1; i <= high; i++)//輸出倒立等腰三角形
{
for (int j = 1; j <=high*2-i; j++)
{
if (i > j)
{
cout << ' ';
}
else
{
cout << arr;
}
}
cout << endl;
}
for (int i = 2; i <= high; i++)//輸出正立等腰三角形,注意有公共頂點,高度從2開始
{
for (int j = 1; j <= high - i; j++)
{
cout << ' ';
}
for (int j = 1; j <= 2 * i - 1; j++)
{
cout << arr;
}
cout << endl;
}
cout << lef;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/413015.html
標籤:其他
上一篇:Spring AOP的術語總結
下一篇:7-2 素數對猜想
