PTA L1_002 打印沙漏(C语言)

  • 用C语言打印一个沙漏
    • 一、题目概要
    • 二、题目分析
    • 三、解题思路
      • (一)、给定的字符可以打印几行
      • (二)、剩余的字符数
      • (三)、如何输出沙漏
    • 四、代码一览
    • 五、作者相关
      • 作者简介
      • 联系方式

用C语言打印一个沙漏

一、题目概要

题目要求:本题要求你

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

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805145370476544

下面是题干的信息,不想看这眼花缭乱的那么多的直接从【二、】看起就好

二、题目分析

这题是啥意思呢,简单说就是总共有n个符号,用这些符号打印最大的沙漏形状,再输出没用到的符号的个数。所以说我们需要分析出 –可以打印的行数– 、 – 没有用到的字符数– 、 –如何输出沙漏 – 。
需要用到的变量如下:

 // 给定的符号数  半个沙漏行数  输出沙漏所需的符号数  剩下没有用到的符号数int sum, halfLine, temp, leftSignNum;// 需要输出的符号char sign = '*';

三、解题思路

(一)、给定的字符可以打印几行

让我们找一下沙漏的规律:

  • 首先沙漏是对称的,所以方便起见,我们说的几行也就是半个沙漏的行数
  • 其次从沙漏中间到两边是按1,3,5,7,2n-1,···的规律排列的。
  • 所以,打印沙漏总共需要的星星数就是对(2n-1)这个等差数列求和乘以2再减去1的值(这个中学知识就可以解决),化简完成后的结果2n2-1, 其中n为沙漏一半的的行数(包含中间那个孤零零的符号)。
  • 最后只需要从有一行开始挨个判断打印沙漏需要的符号数与给定的符号数就好啦,然后就可以找到给定的字符数可以最多打印多少行啦。
// 程序判断可以打印几行
while (1){temp = 2 * halfLine * halfLine - 1;if (sum >= temp){halfLine++;// 这儿可以顺带计算留下的符号数leftSignNum = sum - temp;}else{halfLine--;break;}   }

(二)、剩余的字符数

这个就很简单的啦,直接拿给定的符号数减去要输出的字符数就好啦。

(三)、如何输出沙漏

  • 1、输出三角形
    沙漏可以看成是两个三角形,一个n行的倒三角形,一个少了尖的 (n-1) 行正三角形。不同的循环条件可以达到这个效果。而如何打印一个三角形呢?其实就是把空格和符号分别按个数打印就好啦。
 // 打印倒三角形for (int i = halfLine; i >= 1; i--){printBlank(i, halfLine);printSign(i, sign);}// 打印正三角形for (int i = 2; i <= halfLine; i++)// 循环体内代码相同
  • 2、输出空格
    空格数咋确定呢?这儿是以倒三角形最长的一行为第一行来计算的。即空格数就是三角形行数减去正在打印的行数啦。代码如下:
// 打印特定行的空格
//                  当前打印的行数 三角形总行数void printBlank(const int n, const int line){int i = n;while (i < line){printf(" ");i++;}}
  • 3、输出特定符号
    输出特殊符号就好办了吗,就是按 (2n-1)的规律来的吗!不过别忘了行尾输出换行符。
// 打印给定行的特定个数的符号
//                  正在打印的行数 要打印的符号void printSign(const int line, const char sign){int starnum = 2 * line - 1;for (int i = 0; i < starnum; i++)printf("%c", sign);printf("\n");}

四、代码一览

来看一下完整的代码时什么样子吧:

#include <stdio.h>
void printSign(const int, const char);
void printBlank(const int, const int);
int main (void)
{int sum, halfLine, temp, leftSignNum;char sign = '*';leftSignNum = sum = temp = 0;halfLine = 1;scanf("%d %c", &sum, &sign);    getchar();// 看看够打印几行while (1){temp = 2 * halfLine * halfLine - 1;if (sum >= temp){halfLine++;leftSignNum = sum - temp;}else{halfLine--;break;}   }// 打印倒三角形for (int i = halfLine; i >= 1; i--){printBlank(i, halfLine);printSign(i, sign);}// 打印正三角形for (int i = 2; i <= halfLine; i++){printBlank(i, halfLine);printSign(i, sign);}// 没用掉的字符数printf("%d\n", leftSignNum);return 0;
}// 打印给定行的特定个数的符号
void printSign(const int line, const char sign)
{int starnum = 2 * line - 1;for (int i = 0; i < starnum; i++)printf("%c", sign);printf("\n");
}// 打印特定行的空格
void printBlank(const int n, const int line)
{int i = n;while (i < line){printf(" ");i++;}
}

五、作者相关

  • 作者简介

    • 作者:馗顺先生
    • 简介:一个热爱程序设计与电子技术的预备猿。后续也会不定期更新一些有趣的代码,以及一些有用的算法实现。大家可以关注以下哦。最后,若有不足,希望个位大佬们不吝赐教。
  • 联系方式

    • 邮箱:2727144006@qq.com
    • 博客地址: https://blog.csdn.net/qq_33519837?spm=1001.2100.3001.5113

PTA L1_002 打印沙漏(C语言)相关推荐

  1. L1-002打印沙漏C语言,沙漏

    再次看了下,主要看了成本体积的构建. 目录 摘要 1.介绍 2.相关工作(自己去看) 3. Pyramid Stereo Matching Network 3.1 网络结构 3.2 Spatial P ...

  2. PTA L1-002 打印沙漏(详解)

    前言:本期是关于pta题目打印沙漏的具体解法,今天你c了吗?  题目: 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ********* ...

  3. 天梯—打印沙漏以及剩余个数(C语言)

    PTA-打印沙漏以及剩余个数(C语言) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓&quo ...

  4. c语言字母沙漏,C语言打印沙漏,

    C语言打印沙漏, 一.题目: 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓" ...

  5. C语言程序练习-L1-002 打印沙漏 (20分)

    L1-002 打印沙漏 (20分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数 ...

  6. C++学习之路 | PTA乙级—— 1027 打印沙漏 (20 分)(精简)

    1027 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 所谓"沙漏形状",是指每行输出奇数个 ...

  7. PTA自测-1 打印沙漏 python实现

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ************ ***** 所谓"沙漏形状",是指每行输出奇 ...

  8. C语言PAT刷题 - 1027 打印沙漏

    作者的话:若有朋友复制代码去PAT试着运行遇到问题的: 1.可能是格式问题,可以先把从本站复制的代码粘贴到记事本,再把记事本里的代码复制,然后粘贴到PAT的代码区,提交本题回答,应该就可以了: 2.可 ...

  9. 1027 打印沙漏(C语言详解)

    前言 这个题目思路不是很复杂但是我也写了好久(技术菜),关键在于编写"漏斗"的时候的技巧,左边留空格右边不用留就行了. 比较让我疑惑的是为什么构不成沙漏也要打印出一个符号*不然有测 ...

最新文章

  1. windows 3.x编程指南_18000 MHz 可编程衰减器
  2. openfire消息通知推送_微信小游戏内测「订阅消息」能力,这是召回用户的「大杀器」吗?...
  3. Apollo的基本概念和集成实战
  4. CCIE-LAB-第三篇-VRRP+SLA
  5. 《关于我的那些面经》滴滴Java岗(附答案)
  6. PE格式学习讨论群:3214720
  7. 集福宝 支付宝2021年最新一款集福神器
  8. linux下几个压缩命令
  9. UVA10943 How do you add【递推打表】
  10. C++ const与static
  11. windows资源管理器管理工具Qttabbar个人使用总结
  12. MIUI9线刷包精简
  13. java练手代码大全手机版_Java版打字练习游戏源码
  14. gprs数据传输流程
  15. 如何自给自足获取磁力种子
  16. 第8章 中医证型关联规则挖掘代码调整
  17. linux手机内存碎片整理软件,Linux不需要磁盘碎片整理
  18. 【python】python里的关键字
  19. 区块链技术的核心是解决生产关系的问题
  20. 前程无忧达成私有化协议:遭遇大砍价 作价降至43亿美元

热门文章

  1. blob 图片_《你不知道的 Blob》番外篇
  2. java 加载jar_java手动加载jar
  3. xml文件上传服务器读取不了,本地读取服务器Xml文件及本地读本地的xml
  4. 九九乘法表用python怎么写_用python做个九九乘法表
  5. python的基础网络编程是下列_Python基础(六)网络编程
  6. matlab哈明窗带阻,数字信号处理实验1,2,3,4
  7. mysqlevent每天,附答案
  8. C++ 模板:template
  9. python【蓝桥杯vip练习题库】ADV-279矩阵乘法
  10. emmc linux.格式化参数,SD卡, EMMC固化 ,关于bootloader linux