PTA-1027 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:
*****
 ***
  *
 ***
*****
2
#include<iostream>
using namespace std;
int star(int n){
    
    
	int s[1000];
	s[0]=1;
	s[1]=7;
	for(int i=1;i<1000;i++){
    
    
		s[i]=s[i-1]+4*i+2;
		if(n<s[i]){
    
    
			return i-1;
			break;
		}
	}
}
int main(){
    
    
	int n,k,i,j;
	char m;
	cin>>n>>m;
	k=star(n);	//返回行数 
	for(i=0;i<(2*k+1)/2+1;i++){
    
    
		for(j=i;j>0;j--)
			cout<<" ";
		for(j=0;j<2*k+1-2*i;j++)
			cout<<m;
		cout<<endl;
	}
	for(i=(2*k+1)/2+1;i<2*k+1;i++){
    
    
		for(j=i+1;j<2*k+1;j++)
			cout<<" ";
		for(j=0;j<(2*k+1-2*(2*k+1-(i+1)));j++) //一行最大数减去两倍空格数 
			cout<<m;
		cout<<endl;
	}
	int s=0;	//记录打印共花了多少图案 
	for(i=2*k+1;i>=1;){
    
    
		s+=i;
		i=i-2;
	}
	cout<<n-(2*s-1);	//总数减去所花 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44549439/article/details/112912213