欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

B1027(打印沙漏)刷题

程序员文章站 2022-06-11 18:58:11
...

题目

B1027(打印沙漏)刷题

思路:

  1. 用一个数组k[]记录每行的符号个数(从1开始,依次+2);
  2. 用一个数组sum[]记录到第几行总共输出的符号个数。循环当sum超过n时结束,并将i-1就是最大能输出沙漏的上半行数。
  3. 利用i再进行输出。每行输出i-当前行个空格。再输出k[j]个字符。末位不再输出空格。
  4. 最后用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];

}

相关标签: PAT乙级