B1027(打印沙漏)刷题
程序员文章站
2022-06-11 18:58:11
...
题目
思路:
- 用一个数组k[]记录每行的符号个数(从1开始,依次+2);
- 用一个数组sum[]记录到第几行总共输出的符号个数。循环当sum超过n时结束,并将i-1就是最大能输出沙漏的上半行数。
- 利用i再进行输出。每行输出i-当前行个空格。再输出k[j]个字符。末位不再输出空格。
- 最后用n-sum【i】统计多余字符。
坑点:
测试点1错误是由于当n=sum[i]时,最后一行要输出0。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
char c;
cin>>n>>c;
int k[10001],sum[10001];//k记录每行输出的奇数个
k[0]=1;
int i=0;
sum[i]=1;
while(sum[i]<=n){
k[i+1]=k[i]+2;
sum[i+1]=sum[i]+k[i+1]*2;
i++;
}
i--;//此时i行对应sum大于n,那么i-1行对应的沙漏即使最大值
for(int j=i;j>=0;j--){//输出i行,每行输出i-j个空格
for(int t=0;t<i-j;t++){
cout<<' ';
}
int han=k[j];
for(;han>0;han--){//每行输出k[t] 个符号
cout<<c;
}
cout<<endl;
}
for(int j=1;j<=i;j++){//再逆序输出一次
for(int t=0;t<i-j;t++){
cout<<' ';
}
for(;k[j]>0;k[j]--){//每行输出k[t] 个符号
cout<<c;
}
cout<<endl;
}
if(n>=sum[i]) cout<<n-sum[i];
}