解题思路:因为沙漏每行相差都是2个字符,所以我们可以用等差数列求和来计算最多可以打印多少行,再用变量sum来记录一共用了多少个字符,最后输出n-sum即可.N用来计算上半部分三角型的行数.
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
char c;
int row=0;
int sum=0;
cin>>n>>c;
for(int i=0;i<n;i++){
if(4*i+2*i*i+1<=n){
row=2*i+1;
}
}
int N=(row+1)/2;
for(int i=N;i>=1;i--){
for(int j=N-i;j>=1;j--)
cout<<' ';
for(int k=2*i-1;k>=1;k--){
cout<<c;
sum++;
}
cout<<endl;
}
int next=row-N;
for(int i=1;i<=next;i++){
for(int j=next-i;j>=1;j--)
cout<<' ';
for(int k=1;k<=2*i+1;k++){
cout<<c;
sum++;
}
cout<<endl;
}
cout<<n-sum;
}
运行结果如下