例题
现有n个*字符,请打印出能用其打印出的最大沙漏。
输入:只有一行 ,n >= 7
输出:沙漏
(题目瞎编的,反正这种题不少)
思路分析
实质上,每一层*的个数a就是一个等差数列,我们可以使用等差数列的知识来解决这个问题。
第一层 | a0 | 1 | 2 * 1 + 1 |
第二层 | a1 | 3 | 2 * 2 + 1 |
... | ... | ... | |
第n+1层 | an | 2 * n + 1 |
也就是说,可以将沙漏看成是两个全等三角形去掉一个三角形的顶而拼成的。每一层的字符数为2 * n + 1 , 不难求出,所有层(这里指一个三角形)的字符数为n * (n + 2) 。所以根据规律,一整个沙漏的字符数为:2 * Sn-1 - 1 = 2 * n ^ 2 - 1
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main () {
ll n , m = 1;
scanf ("%lld" , &n);//符号的个数
n += 1; // 根据公式,便于计算层数
while (2 * m * m <= n) {
m ++;
}
m --;//上面最后的m算出来是大于n的,所以要-1
for (ll i = m ; i > 0 ; i --) {
for (ll j = 0 ; j < m - i ; j ++){
printf (" ");
}
for (ll j = 0 ; j < 2 * i - 1 ; j ++) {
printf ("*");
}
printf("\n");
}//上半个三角形,包括顶角
for (ll i = m - 2 ; i >= 0 ; i --) {
for (ll j = i ; j > 0 ; j --) {
printf (" ");
}
for (ll j = 2 * (m - i) - 1 ; j > 0 ; j --) {
printf ("*");
}
if (i != 0)printf("\n");
}//下半个三角形,不包括顶角
return 0;
}