1027 打印沙漏 (20 分)
 

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定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 ;
}
 

最新文章

  1. 从DOM操作看Vue&amp;React的前端组件化,顺带补齐React的demo
  2. Hdfs常用操作
  3. Zend Guard Loader/Zend Loader是干什么的
  4. 使用Android点击按钮跳转页面
  5. 【HTML】Iframe中的onload事件
  6. 通过uiview动画来放大图片
  7. Xcode-项目模板修改
  8. Runtime 实现 动态添加属性
  9. cvThreshold
  10. windows下安装wamp和wordpress
  11. Css简介
  12. mysql select不使用任何锁(select with nolock)
  13. react 入门
  14. Mapbox使用详解
  15. NPM,bower的安装目录
  16. 汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
  17. Java的BIO,NIO和AIO的区别于演进
  18. CF700E Cool Slogans
  19. C++程序设计方法3:default修饰符
  20. 动态获取移动端视宽,从而结合rem达到适配

热门文章

  1. BIOS和DOS中断大全
  2. 如果在vscode 中用运行快捷键(Ctrl+Alt+N)出现中文的乱码
  3. laravel 解决 sql mode only_full_group_by
  4. 永久破解pycharm,golang,IDEA开发工具
  5. PAT (Basic Level) Practice (中文)1070 结绳 (25 分) (优先队列)
  6. 原生js判断设备类型
  7. STL-vector-set_difference B - 人见人爱A-B
  8. http接口的调用
  9. C语言运算符的优先级与结合性
  10. 基于Python的face_recognition库实现人脸识别