PAT 乙级1027 天梯 L1-002 打印沙漏
2016-07-13 19:03
495 查看
1027. 打印沙漏(20)
时间限制200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * *** *****
2
解题思路
首先看图形的规律,图形呈上下对称,不看最中间的一个符号,上下的符号数量是一样的,并且每行符号数量等差,从最中间的1个,然后3个、5个、7个,都是奇数个,设行数为n,可以得出如下方程组2n2+4n+1≤x
解方程得到n的最大整数解,利用c语言int类型的性质可以直接得到整数。
然后我们需要知道每一行的最大宽度,可以知道整个图形的最大宽度由最长的那一行决定,则图形宽度为2n+1,最后用循环计算每行需要输出多少个空格,多少个符号即可,循环注释见代码。
代码
#include <cstdio> using namespace std; typedef long long LL; #define rep(i,begin,end) for(int i=begin;i<end;++i) int main(){ int n; char ch[20]; scanf("%d%s",&n,ch); int ni=(int)(sqrt(1-0.5*(1-n)))-1;//解方程得到n,这里是ni int hk=2*ni+1; //计算图形宽度 rep(i,0,ni+1){//注意这里的ni+1,加1的原因是最中间的一个符号也由该循环输出 int xi=(ni-i)*2+1;//计算该行的符号数量 int kg=(hk-xi)/2;//计算改行空格数量 rep(j,0,kg)printf(" ");//打印空格 rep(j,0,xi)printf("%c",ch[0]);//打印符号 printf("\n"); } rep(i,1,ni+1){ //这个循环打印下半部分 int xi=i*2+1; int kg=(hk-xi)/2; rep(j,0,kg)printf(" "); rep(j,0,xi)printf("%c",ch[0]); printf("\n"); } printf("%d\n",n-(ni*ni*2+4*ni+1));//计算剩余的符号数量 return 0; }
相关文章推荐
- libdvbpsi源码分析(四)PAT表解析/重建
- PAT配置
- 什么是端口复用动态地址转换(PAT) 介绍配置实例
- MikroTik layer7-protocol
- PAT是如何工作的
- PAT 乙级题:1002. 写出这个数 (20)
- PAT (Advanced Level) Practise 1001-1010
- 数据结构学习与实验指导(一)
- PAT Basic Level 1001-1010解题报告
- PAT 数素数
- PAT 福尔摩斯的约会
- PAT 德才论
- PAT 月饼
- 1001. 害死人不偿命的(3n+1)猜想
- 1002. 写出这个数
- 1032. 挖掘机技术哪家强
- 1001. 害死人不偿命的(3n+1)猜想 (PAT basic)
- 1002. 写出这个数(PAT Basic)
- 1004. 成绩排名(PAT Basic)
- 1006. 换个格式输出整数(PAT Basic)