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

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大
顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式

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

输出格式

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

输入样例:

19 *

输出样例:

************
*****
2

| 代码长度限制 | 时间限制 ||内存限制 |
|16 KB | 400 ms | 64 MB |

思路:
①这道题需要用等差数列的知识来推导对要打印的层数,然后再进行输出和剩余字符的计算
②除去中间的单个字符,图形上下是对称的,只看下半部分的话(有a1=3,a2=5,a3=7...),所以层号和每层的字符数之间的关系为an=2n+1
③由a1=3,an=2n+1,根据等差数列前N项和公式Sn=n(a1+an)/2求得此问题中上下两个对称层的Sna=n(n+2)
所以全部字符的数量为2S(n-1)+1=2×n^2-1,但是n并不是层数,真正的层数是2n-1
④推导过程可参考下图,建议大家可以在草稿纸上画个图形对着进行推导,这样更加直观:

a1=3,a2=5,a3=7,a4=9......,an=2n+1
Sna=n(n+2)   //除中间一个字符外的上或下半边字符数量的前n项和公式
↓↓↓↓↓↓↓↓↓↓
b1=1+2×0
b2=1+2×3
b3=1+2×(3+5)
b4=1+2×(3+5+7)
......
bn = 1+2×(a1+a2+a3+...+a(n-1)) = 1+2S(n-1)a = 2×n^2-1   //图形中全部字符的数量和半边层数n的关系式
//n在b中所指的半边的层数包括了中间一层,因为bn最小是从1开始的,所以全部的层数为2n-1层

⑤根据公式bn求出可以达到的最大层数,条件是bn不能大于题目中的N(可以使用的字符数量),见代码部分的7~10行,然后求出剩余没用掉的字符数量,剩下的图形输出部分就并不难了

代码:

#include<bits/stdtr1c++.h>
using namespace std;
int main() {int sum;char c;scanf("%d %c", &sum, &c);int h = 1;while (2 * h * h - 1 <= sum) h++;  //根据公式写出条件来判断出半边的层数h -= 1;int len = 2 * h - 1;  //len为一共有多少层int surplus = sum - (2 * h * h - 1); //计算出剩下的字符数量int up_len = len / 2 + 1, down_len = len / 2;  //分别求出上半部分和下半部分的层数for (int i = up_len, j = 0; i >= 1; i--, j++) {for (int k = 0; k < j; k++) printf(" ");for (int k = 0; k < i * 2 - 1; k++) printf("%c", c);cout << endl;}  //打印上半层(包括中间一点)for (int i = 2, j = down_len - 1; i <= down_len + 1; i++, j--) {for (int k = 0; k < j; k++) printf(" ");for (int k = 0; k < i * 2 - 1; k++) printf("%c", c);cout << endl;}  //打印下半层cout << surplus; //输出剩余的字符数量return 0;
}

PTA乙级 1027 打印沙漏——20分相关推荐

  1. C++学习之路 | PTA乙级—— 1027 打印沙漏 (20 分)(精简)

    1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...

  2. PTA练习题1027 打印沙漏 (20分)

    1027 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...

  3. 1027 打印沙漏 (20 分)

    1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...

  4. 【PAT乙级】1027 打印沙漏 (20 分)

    题目地址 #include<cstdio> #include<iostream> using namespace std; int main(void) {int n; cha ...

  5. 1027 打印沙漏 (20分)——27行代码AC(结构清晰)

    立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ********** ...

  6. PAT 乙级 1027. 打印沙漏(20) Java版

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓"沙漏形状",是指每行输出奇 ...

  7. 1027 打印沙漏 (20分)

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符号:各行符号中心对齐:相邻两行符 ...

  8. C语言程序练习-L1-002 打印沙漏 (20分)

    L1-002 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数 ...

  9. 1027. 打印沙漏(20)

    1027. 打印沙漏(20) C++AC代码(更新于2017年4月9日) 解题思路,注意到行数与第一行和最后一行字符数都是相等的,根据等差数列找关系 #include <iostream> ...

最新文章

  1. CSS3与动画有关的属性transition、animation、transform对比
  2. C#连接sqlserver数据库
  3. zabbix—自动发现端口并监控
  4. Mysql数据库的基本概念
  5. 【杭州】Hack for Cloud Beginner微软黑客松大赛
  6. Redis(四):String字符串数据类型详解
  7. 浙大 PAT a1058
  8. python-知识回顾-16
  9. Django视图与模板+vs2019
  10. 为什么说红黑树是“近似平衡”的?
  11. POJ2255 Tree Recovery 前序 中序求后序
  12. CDH-CM资源下载
  13. java做界面_java怎么做出界面?实例讲解
  14. Qt:34---MDI多文档界面
  15. caffe:将mean.binaryproto文件转化为mean.npy文件
  16. 涨知识了!阿里规定超过三张表禁止join,为啥?
  17. java的四种访问权限_Java四种访问权限
  18. java实现顺时针螺旋填入
  19. lsm mysql_一文了解数据库索引:哈希、B-Tree 与 LSM
  20. 歌德巴赫猜想---java

热门文章

  1. Redis:缓存雪崩、缓存击穿、缓存击穿
  2. VS2010中VC9.0Runtime与VC10.0Runtime在win7上装不上提示error code 1603
  3. 关于对掘金和csdn的认识
  4. web前端入门到实战:仿美团详情页与购物车源码-首页实现
  5. idea停止调试_IntelliJ IDEA:运行和调试脚本
  6. 静态函数库,共享函数库以及动态链接库
  7. c语言检索课题报告,文献检索实验报告(一)范文 - 图文
  8. Linux 文件系统与inode,软硬链接
  9. PowerBI-日期和时间函数-DATE\EDATE\DATEVALUE
  10. 使用实验室LIMS系统后有什么不一样?