一首好曲推荐:同时我也设置成了我的博客背景音乐

《开启新征程》 &mdas

收藏链接:

————————————————题目———————————————————-

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

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

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意n个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

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

输出格式:

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

输入样例:

19 *

输出样例:

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

————————————————题目———————————————————-

(一) 题目分析:

首先经过题目分析,可知特殊符号数跟行数有着某种特殊关系,除去中间的一颗星星*,可以发现上半部分的是个递增的等差数列:3,5,7,9,…….,可得通项公式2n+1(其中n = 上半部分行数 = 下半部分行数)

那么求和即为sn = n2+2n,这是上半部分的。那么上下两部分即可得到:

总**用量:2( n2+2n) =  2n2+4n

到这里我们就可以算出输入的数能生成几行了。

(二)代码分块:

首先,先计算得出能上下部分各能生成几行:

for(i = 1;;i++) { temp = 2*i*i+4*i; if(temp > cnumber-1) break; max = temp; }

temp临时存放下一行所需的总量,如果这个总量超过了输入的量数,那么就break打破永真循环,不把temp值赋值给max行数,否则就把temp的行数赋值给max变量。

第二步,绘制上半部分:

for(temp = i-1;temp>0;temp--) { for(int count = 0;count != (i-1)-temp;count++) printf(" "); for(int count = 0;count

这时候的temp就是行数了,i-1是因为永真循环的时候被i++多了一次,所以需要减掉,以样例为例,输入19后,此时temp应该为2,也就是给上半部分绘制两行。

因为题目要求中心对齐,我们同时也发现空格和行数之间的关系,例如第一行是没有空格的,第二行有一个空格,第三行有两个空格,所以通过空格数和行的关系去输出即可,然后每一行最后都换行,代码就形成了。

第三步,绘制下半部分:

for(temp = 0;temp<=i-1;temp++) { for(int count = 0;count != (i-1)-temp;count++) printf(" "); for(int count = 0;count

此时需要注意,最外层的for,在绘制上半部分的时候,是temp>0,是不取边界的,如果取了边界会使上部分多画一行单个*。我这里选择的是下半部分取绘制这单个*,因此需要temp<=i-1,取到边界。

(三)ac代码:

#include #include using namespace std; int cnumber,max,i,temp; char symbol; int main() { scanf("%d %c",&cnumber,&symbol); for(i = 1;;i++) { temp = 2*i*i+4*i; if(temp > cnumber-1) break; max = temp; } for(temp = i-1;temp>0;temp--) { for(int count = 0;count != (i-1)-temp;count++) printf(" "); for(int count = 0;count

(四)ac截图:

(五)解后分析

题目难度不大,刚开始可能手生,在写for的时候总是渲染多一行或者找错最大行数。

推荐知识:

1、将声明变量放在main主函数外,可以申明稍微大型一点的变量,因为main的函数栈容量有限。同时还有一个好处,在函数外申明数组的时候会自动默认全为0清零。

2、推荐使用scanf(“%d %c”,&cnumber,&symbol); printf(“%c”,symbol); 这种c语言输入输出方式,在acm中将能大大减少输入输出所占用的算法时间。

(六)优质解法更新:

这是在写博客的时候突然想到可以从上到下一次性绘图,写完博客就去试了一下,还真的可以,空间复杂度大大降低了,同样也ac,现在贴上代码:

#include #include #include using namespace std; int cnumber,max,i,temp; char symbol; int main() { scanf("%d %c",&cnumber,&symbol); for(i = 1;;i++) { temp = 2*i*i+4*i; if(temp > cnumber-1) break; max = temp; } for(temp = 2*(i-1);temp>=0;temp--) { for(int count = i-1;count != abs((i-1)-temp);count--) printf(" "); for(int count = 0;count<2*abs(temp-i+1) + 1;count++) printf("%c",symbol); printf("n"); } printf("%d",cnumber-max-1); return 0; }

可以发现内存使用量大大减少,将两块的上下绘制合并到一块之后代码空间复杂度下降很多。

注:如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/605112.html

c语言pta判断字符或数字的昵称,c/c++开发分享『ACM C++』PTA浙大 | 基础题 – 打印沙漏...相关推荐

  1. 『ACM C++』 PTA 天梯赛练习集L1 | 016-017

    今天开了两个大会,时间都给占掉了,就刷了两道题~ 明天加油!!! ------------------------------------------------L1-016------------- ...

  2. 『ACM C++』 PTA 天梯赛练习集L1 | 048-49

    今日刷题048-049 ------------------------------------------------L1-048---------------------------------- ...

  3. c语言同时代表数字和字符,C语言实现将字符和数字串到一起

    C语言实现将字符和数字串到一起 C 语言 是相对比较低级的一种语言,所有的数据都是按照 整数.浮点数.数组.指针 一类的数据结构来表示的. 相比之下,较高级的语言中 数据类型之间的转换就更自由一些. ...

  4. 怎么用c语言判断是否为纯字母,c语言如何判断字符是否为英文字母isalpha()学习...

    c语言如何判断字符是否为英文字母?我们可以使用isalpha()方法就可以了.定义函数:int isalpha(int c); isalpha()函数介绍:判断参数 c 是否为英文字母,在标准c 语言 ...

  5. C语言oj学生成绩输入和输出,『ACM入门』蓝桥杯ACM训练系统基本输入输出教程

    在介绍训练场的OJ系统之前,首先为大家介绍一下ACM: ACM原代表美国计算机协会,因其举办的ICPC即国际大学生程序设计竞赛而闻名全世界,此项赛事要求学生的在五小时内解决全英文问题,并在效率和速度以 ...

  6. C语言怎么判断字符YN,c语言中的宏_详解(转)

    1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和标 ...

  7. c语言c判断字符数字,c语言问题求教 利用函数判断字符串中是否全为数字

    c语言问题求教 利用函数判断字符串中是否全为数字 答案:4  信息版本:手机版 解决时间 2018-12-22 19:42 已解决 2018-12-22 08:52 c语言问题求教 利用函数判断字符串 ...

  8. c语言怎么判断字符是否为字母和数字,C语言判断字符串是否为数字

    标签:c 判断一个字符串是否为数字, 听起来很简单,实现还是有点难度的. 最近写了一个,如下: #define IS_BLANK(c) ((c) == ' ' || (c) == '\t') #def ...

  9. c语言判断字符是汉字,c语言里面判断字符是否为汉字

    这是跟汉字的存储方式有关,西文字符用ASCII码的话,一个字节可以表示一个字符,而汉字用的是双字节表示一个汉字. 那么,为了在机器内部区分ASCII码和汉字机内码,就规定汉字的两个字节的最高为都为1. ...

最新文章

  1. PHPCMS 错误日志 Only variables should be passed by ...
  2. System.arraycopy和Arrays.copyOf的原理解剖
  3. rails.vim环境安装(ubuntu)
  4. 总线接口与计算机通信
  5. 21 CO配置-控制-产品成本控制-成本对象控制-检查制造订单 (PP) 的成本核算变式
  6. IC-CAD Methodology企业实战之openlava
  7. HTML5 Canvas 裁剪区域
  8. 在用户空间加载和卸载驱动
  9. git 查看修改明细_git查看某个文件的修改历史
  10. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展trim,trimLeft,trimRight方法(2)...
  11. android 手机型号 命名规则,自己整理:各大品牌安卓手机的型号命名规律
  12. 用php表示掷骰子两次比大小,php实现的中秋博饼游戏之掷骰子并输出结果功能详解...
  13. 关于MemoryBarrier
  14. d6u android,天敏D6U_Android4.4.2_SONY BRAVIA_精简优化双启动版
  15. 二维码与图像结合生成器之QArt(关于Russ Cox )
  16. lstrip在python中是什么意思_什么样的墨算好墨,现在学书法还用墨块么,墨块墨水哪个好...
  17. 禅道配置smtp发信没反应
  18. LLL —— SVP渐进算法(简记)
  19. 金地农村土地承包经营权证打证系统
  20. 转载:做正确的事情,等着被开除(Do the right thing, Wait to get fired)

热门文章

  1. mysql(mariadb)的安装与使用,mysql相关命令,mysql数据类型
  2. ML、DL、CNN学习记录3
  3. 点赞时代,你为什么被人绝交?
  4. C语言复习4_while循环
  5. Paw —— 比Postman更舒服的API利器
  6. JDBC Statements, PreparedStatement
  7. c/s架构nginx+php-fpm通信原理
  8. xcode4.3.2 arc模式下导入非arc的文件 转
  9. SqlHelper V1.0 (C#)
  10. sqlserver约束