1027 打印沙漏 (20 分)
 

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

  1. *****
  2. ***
  3. *
  4. ***
  5. *****

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

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

输入格式:

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

输出格式:

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

输入样例:

  1. 19 *

输出样例:

  1. *****
  2. ***
  3. *
  4. ***
  5. *****
  6. 2
  7. 初步答案:
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int N;
  5. char ch;
  6. scanf("%d %c", &N, &ch);
  7.  
  8. int num = ; //记录上三角的行数
  9.  
  10. for (int i = 1; i <= N; i++)
  11. 11 {
  12. 12 if (2 * i * i - 1 <= N)
  13. 13 num = i;
  14. 14 else
  15. 15 break;
  16. 16 }
  17.  
  18. //打印上三角
  19. for (int i = ; i < num; i++)
  20. {
  21. for (int j = ; j < i; j++)
  22. printf(" ");
  23. for (int j = i; j < (num - i) * 2 - 1 + i; j++)
  24. 24 printf("%c", ch);
  25. printf("\n");
  26. }
  27.  
  28. //打印下三角
  29. for (int i = ; i <= num; i++)
  30. {
  31. for (int j = ; j < num - i; j++)
  32. printf(" ");
  33. for (int j = num - i; j < i * 2 - 1 + num - i; j++)
  34. 35 printf("%c", ch);
  35. printf("\n");
  36. }
  37.  
  38. printf("%d", N - * num * num + );
  39.  
  40. return ;
  41. }

看了答案后改进后的答案:

1.我之前计算上三角的行数是用枚举的方式,其实可以直接用2 * row ^2 - 1 <= N; 解出这个不等式row <= sqrt((N + 1)/2)'

2.打印字符其实从0开始到2 * row - 1即可,不必在开始条件和结束条件中都加上前面空格的数量

  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main()
  5. {
  6. int N;
  7. char ch;
  8. scanf("%d %c", &N, &ch);
  9.  
  10. int num = ; //记录上三角的行数
  11.  
  12. num = (int)sqrt((N + 1.0) / 2);
  13.  
  14. //打印上三角
  15. for (int i = ; i < num; i++)
  16. {
  17. for (int j = ; j < i; j++)
  18. printf(" ");
  19. for (int j = 0; j < (num - i) * 2 - 1; j++)
  20. 20 printf("%c", ch);
  21. printf("\n");
  22. }
  23.  
  24. //打印下三角
  25. for (int i = ; i <= num; i++)
  26. {
  27. for (int j = ; j < num - i; j++)
  28. printf(" ");
  29. for (int j = 0; j < i * 2 - 1; j++)
  30. 31 printf("%c", ch);
  31. printf("\n");
  32. }
  33.  
  34. printf("%d", N - * num * num + );
  35.  
  36. return ;
  37. }

答案的做法似乎更加巧妙:

以下是答案的解题思路和代码:

代码:

  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main()
  5. {
  6. int N;
  7. char c;
  8. scanf("%d %c", &N, &c);
  9.  
  10. int bottom = (int)sqrt((N + 1.0) * ) - ; //底边星型字符的数量
  11. if (bottom % == ) //如果bottom是偶数,bottom减一变成奇数
  12. bottom--;
  13.  
  14. for (int i = bottom; i >= ; i -= )
  15. {
  16. for (int j = ; j < (bottom - i) / ; j++)
  17. printf(" ");
  18.  
  19. for (int j = ; j < i; j++)
  20. printf("%c", c);
  21.  
  22. printf("\n");
  23. }
  24.  
  25. //打印下三角
  26. for (int i = ; i <= bottom; i += )
  27. {
  28. for (int j = ; j < (bottom - i) / ; j++)
  29. printf(" ");
  30. for (int j = ; j < i; j++)
  31. printf("%c", c);
  32.  
  33. printf("\n");
  34. }
  35.  
  36. printf("%d", N - (bottom + ) * (bottom + ) / + );
  37.  
  38. return ;
  39. }
  1.  

B1027 打印沙漏的更多相关文章

  1. 【算法笔记】B1027 打印沙漏

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

  2. PAT B1027 打印沙漏(20)

    思路: 使用数组保存每一行沙漏的最大符号数 输入一个正整数和一个符号 遍历数组,找到大于正整数的数组下标 j. 三角形底边的字符数为 (j - 1) * 2 - 1 打印沙漏 打印剩余字符:x - n ...

  3. PAT B1027 打印沙漏 (20 分)

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...

  4. 【PAT】B1027 打印沙漏(20 分)

    #include<cstdio> #include<stdlib.h> char C='*'; int qiushu(int hang){//输入行数,求出字符数 int su ...

  5. PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌

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

  6. PAT乙级 1027. 打印沙漏(20)

    1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...

  7. PAT (Basic Level) Practise (中文)1027. 打印沙漏(20)

    1027. 打印沙漏(20) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...

  8. PAT-乙级-1027. 打印沙漏(20)

    1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...

  9. 团体程序设计天梯赛-练习集L1-002. 打印沙漏

    L1-002. 打印沙漏 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给 ...

随机推荐

  1. Spring Boot源码(二):SPI去除web.xml

    SPI广泛用于dubbo,spring boot,spring cloud alibaba等 关于SPI,可见SPI-Service Provider Interface 继续上篇文章 上面三句代码的 ...

  2. 牛客寒假6-I 导航系统

    链接:https://ac.nowcoder.com/acm/contest/3007/I来源:牛客网 题目描述 小 Q 所在的国家有 N 个城市,城市间由 N-1 条双向道路连接,任意一对城市都是互 ...

  3. sqli-labs less-9 --> less-10

    时间盲注: 利用时间函数,观察不同条件的等待时长:利用sleep(),benchmark()等函数,让MySQL的执行时间变长 时间盲注多于if这样的函数结合(if(expr1,expr2,expr3 ...

  4. ADO.NET中的数据库帮助类

    ADO.NET是.net framework中的一个重要模块,用于程序和数据源的连接,它的类都位于 System.Data.dll 中. 用于SQLServer的命名空间:System.Data.Sq ...

  5. 1级搭建类110-Oracle 18c SI FS(Windows Server 2019)公开

    Oracle 18c 单实例文件系统在Windows Server 2019上的安装 在线查看

  6. Pikachu-php反序列化

    在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize()序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象 ...

  7. JavaScript-事件处理程序

    DOM事件流: 1.事件冒泡 2.事件捕获 DOM2事件流: 1.事件捕获阶段 2.处于目标阶段 3.事件冒泡阶段 DOM3事件 事件处理程序: 1.HTML事件处理程序: 例一:<input ...

  8. Spring-Boot-2.0.0-M1版本将默认的数据库连接池从tomcat jdbc pool改为了hikari

    spring-configuration-metadata.json spring-boot-autoconfigure-2.0.0.M7.jar!/META-INF/spring-configura ...

  9. linux分区命令parted的用法

    parted的适用场景 创建操作大于2T的分区 一般情况下,我们都是选择使用fdisk工具来进行分区,但是目前在实际生产环境中使用的磁盘空间越来越大,呈TiB级别增长:而常用的fdisk这个工具对分区 ...

  10. python3函数的参数

    函数的定义能简化代码的逻辑,对于函数的调用者来说,只需要知道如何正确的传递参数,以及知道函数将返回什么值就可以了,而函数内部的复杂逻辑被封装起来,调用者不必了解. 位置参数 调用函数时,传入实参的值按 ...