PAT乙级1027 打印沙漏

首先想吐糟一下这个题,我还没有考虑符号数小于七个的情况就ac了
思路很简单
1.它给了一个数,我们组成图形的数目是固定的,而且满足1+3x2+5x2+7x2的规律,那么我们就可以计算出剩下的符号数。(for循环找最大满足组成图形的符号数)
2.根据最大满足条件的符号数,我们就能画出图形。
	1.画的时候分三部分来画  上下对称和中间的那一个
	2.上下可以确认行数,我们可以用之前的for循环里的i来当做
	行数
3.还有一个点就是确认空格数,可以根据for循环里面的值来确认,
例如输出上面的图形时,我们第一步是不需要空格的。具体看代码。

```c
#include<bits/stdc++.h>
using namespace std;
int main()
{
	
	int n;
	char z;
	cin>>n>>z;
	//考虑小于七个的情况
	
	//大于七个的情况
	
	int i=0,sum=1,flag=0;//flag用来保存满足题意最大的sum 
	for(i=1;sum<=n;i++)
	{
		flag=sum; 
		sum+=(2*i+1)*2;	
	}	
//	cout<<n-flag<<endl;//组合完图形之后剩下这么多

	//输出图形
	for(int j=i-2;j>0;j--)
	{
		
		if(i-2-j)
         {
             for(int m = 0; m < i-2-j; m++)
             {
                 printf(" ");
             }
         } 
		for(int k=2*j+1;k>0;k--)
		{
			cout<<z;
		}
		cout<<endl;
	}
	for(int l=0;l<i-2;l++)
	{
		cout<<" ";
	}
	cout<<z<<endl;
	for(int j=1;j<=i-2;j++)
	{
		
		if(i-2-j)
         {
             for(int m = 0; m < i-2-j; m++)
             {
                 printf(" ");
             }
         } 
		for(int k=0;k<2*j+1;k++)
		{
			cout<<z;
		}

		cout<<endl;

	}
	cout<<n-flag;//组合完图形之后剩下这么多
	
	 
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值