题目链接(https://pintia.cn/problem-sets/994805260223102976/problems/994805294251491328)
《算法笔记》的写法太复杂了,没有必要,换一种思路,取temp是沙漏顶端到沙漏中间(包括两端)之间的行数,就会简单很多。代码如下:
#include <cstdio>
#include <cmath>
void print(int temp, int i, char ch){
for (int j=0; j<temp-i; j++) printf(" ");
for (int j=0; j<2*i-1; j++) putchar(ch);
printf("\n");
}
int main(){
int n;
char ch;
scanf("%d %c",&n,&ch);
int temp=sqrt((n+1)/2.0);
for (int i=temp; i>=1; i--) print(temp,i,ch);
for (int i=2; i<=temp; i++) print(temp,i,ch);
printf("%d",n-(2*temp*temp-1));
}
最关键的int temp=sqrt((n+1)/2.0);取这个值是根据以下公示:
1
+
3
+
5
+
⋅
⋅
⋅
⋅
⋅
⋅
+
(
2
n
−
1
)
=
(
1
+
2
n
−
1
)
∗
n
2
=
n
2
1+3+5+······+(2n-1)=\frac{(1+2n-1)*n}{2}=n^2\\
1+3+5+⋅⋅⋅⋅⋅⋅+(2n−1)=2(1+2n−1)∗n=n2
公式里面的n就相当于temp,沙漏上面有temp行,下面有temp-1行,那么总字符数就是:
t
e
m
p
2
+
t
e
m
p
2
−
1
=
2
t
e
m
p
2
−
1
≤
n
⇒
t
e
m
p
≤
n
+
1
2
temp^2+temp^2-1=2\ temp^2-1\leq n\\ \\ \Rightarrow temp\leq \sqrt{\frac{n+1}{2}}
temp2+temp2−1=2 temp2−1≤n⇒temp≤2n+1
很容易理解。