PTA乙级 1027 打印沙漏——20分
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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分相关推荐
- C++学习之路 | PTA乙级—— 1027 打印沙漏 (20 分)(精简)
1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...
- PTA练习题1027 打印沙漏 (20分)
1027 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符 ...
- 1027 打印沙漏 (20 分)
1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...
- 【PAT乙级】1027 打印沙漏 (20 分)
题目地址 #include<cstdio> #include<iostream> using namespace std; int main(void) {int n; cha ...
- 1027 打印沙漏 (20分)——27行代码AC(结构清晰)
立志用更少的代码做更高效的表达 PAT乙级最优题解-->传送门 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ********** ...
- PAT 乙级 1027. 打印沙漏(20) Java版
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓"沙漏形状",是指每行输出奇 ...
- 1027 打印沙漏 (20分)
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个符号:各行符号中心对齐:相邻两行符 ...
- C语言程序练习-L1-002 打印沙漏 (20分)
L1-002 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数 ...
- 1027. 打印沙漏(20)
1027. 打印沙漏(20) C++AC代码(更新于2017年4月9日) 解题思路,注意到行数与第一行和最后一行字符数都是相等的,根据等差数列找关系 #include <iostream> ...
最新文章
- CSS3与动画有关的属性transition、animation、transform对比
- C#连接sqlserver数据库
- zabbix—自动发现端口并监控
- Mysql数据库的基本概念
- 【杭州】Hack for Cloud Beginner微软黑客松大赛
- Redis(四):String字符串数据类型详解
- 浙大 PAT a1058
- python-知识回顾-16
- Django视图与模板+vs2019
- 为什么说红黑树是“近似平衡”的?
- POJ2255 Tree Recovery 前序 中序求后序
- CDH-CM资源下载
- java做界面_java怎么做出界面?实例讲解
- Qt:34---MDI多文档界面
- caffe:将mean.binaryproto文件转化为mean.npy文件
- 涨知识了!阿里规定超过三张表禁止join,为啥?
- java的四种访问权限_Java四种访问权限
- java实现顺时针螺旋填入
- lsm mysql_一文了解数据库索引:哈希、B-Tree 与 LSM
- 歌德巴赫猜想---java
热门文章
- Redis:缓存雪崩、缓存击穿、缓存击穿
- VS2010中VC9.0Runtime与VC10.0Runtime在win7上装不上提示error code 1603
- 关于对掘金和csdn的认识
- web前端入门到实战:仿美团详情页与购物车源码-首页实现
- idea停止调试_IntelliJ IDEA:运行和调试脚本
- 静态函数库,共享函数库以及动态链接库
- c语言检索课题报告,文献检索实验报告(一)范文 - 图文
- Linux 文件系统与inode,软硬链接
- PowerBI-日期和时间函数-DATE\EDATE\DATEVALUE
- 使用实验室LIMS系统后有什么不一样?