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 作者 陈越 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给 ...
随机推荐
- 【巨杉数据库SequoiaDB】巨杉数据库 v5.0 Beta版 正式发布
2020年疫情的出现对众多企业运营造成了严重的影响.面对突发状况,巨杉利用长期积累的远程研发协作体系,仍然坚持进行技术创新,按照已有规划推进研发工作,正式推出了巨杉数据库(SequoiaDB) v ...
- udp_demo(傻瓜来回发送)
代码讲解 import socket # 发送数据 def send_data(udp_socket, dest_ip, dest_port): send_msg = input('请输入要发送的数据 ...
- svn error: "Previous operation has not finished; run 'cleanup' if it was interrupted"
出现这种问题,有几个原因 1.本身文件确实是锁住了 2.之前clean up 过很多次,但是每次都可能以失败告终,造成work queue存在缓存队列 3.svn lock 有lock记录 以下是简单 ...
- python中的__dict__和dir()的区别
Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: __di ...
- 统一操作系统 UOS 回应质疑 (独立思考)
统一操作系统 UOS 回应质疑 自从统一操作系统UOS正式版面向合作伙伴发布之后,小编就关注到网上对统一操作系统UOS众说纷纭.留意了近期网友们发表的评论: “又多了一个骗钱的国产操作系统” “从UO ...
- 1315E Double Elimination DP 01枚举状态和倍增思想
E. Double Elimination DP 01枚举状态和倍增思想 题意 参考DOTA2双败赛制,一共有\(2^n\)个队打n轮 其中你有k喜欢的队伍,由你掌控比赛的输赢请问比赛中包含你喜欢的队 ...
- Windows10通过命令行导出笔记本电池使用信息
powercfg /batteryreport /output "D:\Thinkpad x1c\battery_report_2020_2_25.html" 可以导出电池的电池类 ...
- BZOJ 3438 小M的礼物
BZOJ 3438 小M的礼物 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子 有1个(就是可以种一棵作物)(用1. ...
- Ueditor1.4.3.3 asp UTF-8版文件缺失修改方法
前几天在做一个项目中需要用富文本编辑器,最终选定用Ueditor编辑器,从官网下载源码(http://ueditor.baidu.com/website/download.html),按照文档创建de ...
- JAVA StringUtils工具类
org.apache.commons.lang Class StringUtils java.lang.Object org.apache.commons.lang.StringUtils publi ...