L1-002 打印沙漏 (20 分)
Published on 2022-11-17 23:02 in 暂未分类 with 林动

L1-002 打印沙漏 (20 分)

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

    *****
     ***
      *
     ***
    *****
    

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

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

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

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

    输入样例:
    19 *
    输出样例:

    *****
     ***
      *
     ***
    *****
    2
    
    #include<bits/stdc++.h>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const int N=100005;
    char c;
    int f(int x)//计算层数对应的总符号数
    {
    	int res=0;
    	for(int i=1;i<=x;++i){
    		res+=i*2-1;
    	}
    	res*=2;
    	res-=1;
    	return res;
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	int n;cin>>n>>c;
    	int t=0;
    	for(int i=50;i>=1;--i)
    	{
    		if(f(i)<=n){
    			t=i;break;
    		}
    	}
    	for(int i=t;i>=1;--i)
    	{
    		for(int j=0;j<(t-i);++j)cout<<" ";
    		int m=i*2-1;
    		for(int j=0;j<m;++j)cout<<c;
    		cout<<endl;
    	}
    	for(int i=2;i<=t;++i)
    	{
    		for(int j=0;j<(t-i);++j)cout<<" ";
    		int m=i*2-1;
    		for(int j=0;j<m;++j)cout<<c;
    		cout<<endl;
    	}
    	cout<<n-f(t);
    	return 0;
    } 
    
    posted @   林动  阅读(14)  评论(0编辑  收藏  举报
    相关博文:
    阅读排行:
    · TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
    · Manus的开源复刻OpenManus初探
    · 写一个简单的SQL生成工具
    · AI 智能体引爆开源社区「GitHub 热点速览」
    · C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
    点击右上角即可分享
    微信分享提示