B1027 打印沙漏
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
***
*
***
*****
2
初步答案:
#include <stdio.h>
int main()
{
int N;
char ch;
scanf("%d %c", &N, &ch); int num = ; //记录上三角的行数 for (int i = 1; i <= N; i++)
11 {
12 if (2 * i * i - 1 <= N)
13 num = i;
14 else
15 break;
16 } //打印上三角
for (int i = ; i < num; i++)
{
for (int j = ; j < i; j++)
printf(" ");
for (int j = i; j < (num - i) * 2 - 1 + i; j++)
24 printf("%c", ch);
printf("\n");
} //打印下三角
for (int i = ; i <= num; i++)
{
for (int j = ; j < num - i; j++)
printf(" ");
for (int j = num - i; j < i * 2 - 1 + num - i; j++)
35 printf("%c", ch);
printf("\n");
} printf("%d", N - * num * num + ); return ;
}
看了答案后改进后的答案:
1.我之前计算上三角的行数是用枚举的方式,其实可以直接用2 * row ^2 - 1 <= N; 解出这个不等式row <= sqrt((N + 1)/2)'
2.打印字符其实从0开始到2 * row - 1即可,不必在开始条件和结束条件中都加上前面空格的数量
#include <stdio.h>
#include <math.h> int main()
{
int N;
char ch;
scanf("%d %c", &N, &ch); int num = ; //记录上三角的行数 num = (int)sqrt((N + 1.0) / 2); //打印上三角
for (int i = ; i < num; i++)
{
for (int j = ; j < i; j++)
printf(" ");
for (int j = 0; j < (num - i) * 2 - 1; j++)
20 printf("%c", ch);
printf("\n");
} //打印下三角
for (int i = ; i <= num; i++)
{
for (int j = ; j < num - i; j++)
printf(" ");
for (int j = 0; j < i * 2 - 1; j++)
31 printf("%c", ch);
printf("\n");
} printf("%d", N - * num * num + ); return ;
}
答案的做法似乎更加巧妙:
以下是答案的解题思路和代码:

代码:
#include <stdio.h>
#include <math.h> int main()
{
int N;
char c;
scanf("%d %c", &N, &c); int bottom = (int)sqrt((N + 1.0) * ) - ; //底边星型字符的数量
if (bottom % == ) //如果bottom是偶数,bottom减一变成奇数
bottom--; for (int i = bottom; i >= ; i -= )
{
for (int j = ; j < (bottom - i) / ; j++)
printf(" "); for (int j = ; j < i; j++)
printf("%c", c); printf("\n");
} //打印下三角
for (int i = ; i <= bottom; i += )
{
for (int j = ; j < (bottom - i) / ; j++)
printf(" ");
for (int j = ; j < i; j++)
printf("%c", c); printf("\n");
} printf("%d", N - (bottom + ) * (bottom + ) / + ); return ;
}
B1027 打印沙漏的更多相关文章
- 【算法笔记】B1027 打印沙漏
1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇 ...
- PAT B1027 打印沙漏(20)
思路: 使用数组保存每一行沙漏的最大符号数 输入一个正整数和一个符号 遍历数组,找到大于正整数的数组下标 j. 三角形底边的字符数为 (j - 1) * 2 - 1 打印沙漏 打印剩余字符:x - n ...
- PAT B1027 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...
- 【PAT】B1027 打印沙漏(20 分)
#include<cstdio> #include<stdlib.h> char C='*'; int qiushu(int hang){//输入行数,求出字符数 int su ...
- PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌
-自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...
- PAT乙级 1027. 打印沙漏(20)
1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...
- PAT (Basic Level) Practise (中文)1027. 打印沙漏(20)
1027. 打印沙漏(20) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...
- PAT-乙级-1027. 打印沙漏(20)
1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...
- 团体程序设计天梯赛-练习集L1-002. 打印沙漏
L1-002. 打印沙漏 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给 ...
随机推荐
- Spring BeanDefinitionHolder源码解析
BeanDefinitionHolder源码解析 继承关系 实现的接口 和BeanDefinition一样实现了BeanMetadataElement接口,获得了获取数据源(配置类的class对象)的 ...
- JDK下载安装与环境变量配置图文教程【超详细】
JDK下载安装与环境变量配置图文教程[超详细] 创建时间:2019年11月13日11时02分 文章目录 1. JDK介绍 1.1 什么是JDK? 1.2 JDK版本介绍 2. JDK下载与安装 3.w ...
- Eigen库学习---Map类
Eigen中定义了一系列的vector和matrix,相比copy数据,更一般的方式是复用数据的内存,将它们转变为Eigen类型.Map类很好地实现了这个功能. Map定义 Map(PointerAr ...
- 订阅消息---由于微信小程序取消模板消息,限只能开发订阅消息
订阅消息开发步骤: 1.小程序管理后台添加订阅消息的模板 2.小程序前端编写调用(拉起)订阅授权 wx.requestSubscribeMessage({ tmplIds: ['34fwe1211xx ...
- ubuntu18.04图形模式切换到命令模式
命令模式 :Ctrl+Alt+F5 图形模式:Ctrl+Alt+F1
- IDEA 接口调试插件 HTTP Client
界面客户端 使用手册 https://www.jetbrains.com/help/idea/testing-restful-web-services.html 打开方式 Tools -> HT ...
- ZOJ 4081 Little Sub and Pascal's Triangle 题解
ZOJ 4081 Little Sub and Pascal's Triangle 题解 题意 求杨辉三角第n行(从1开始计数)有几个奇数. 考察的其实是杨辉--帕斯卡三角的性质,或者说Gould's ...
- JavaScript权威指南第6版
描述网页内容的html,描述网页样式的css,描述网页行为的JavaScript js,适合面向对象和函数式编程风格 es5新特性 第二章 词法结构 1.JavaScript程序是用Unicode字符 ...
- Milking Time POJ - 3616 dp 感觉像背包
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
- MPI Maelstrom POJ - 1502 floyd
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> usin ...