B1027 打印沙漏
2024-09-01 15:34:31
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 ;
}
最新文章
- 从DOM操作看Vue&;React的前端组件化,顺带补齐React的demo
- Hdfs常用操作
- Zend Guard Loader/Zend Loader是干什么的
- 使用Android点击按钮跳转页面
- 【HTML】Iframe中的onload事件
- 通过uiview动画来放大图片
- Xcode-项目模板修改
- Runtime 实现 动态添加属性
- cvThreshold
- windows下安装wamp和wordpress
- Css简介
- mysql select不使用任何锁(select with nolock)
- react 入门
- Mapbox使用详解
- NPM,bower的安装目录
- 汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
- Java的BIO,NIO和AIO的区别于演进
- CF700E Cool Slogans
- C++程序设计方法3:default修饰符
- 动态获取移动端视宽,从而结合rem达到适配
热门文章
- BIOS和DOS中断大全
- 如果在vscode 中用运行快捷键(Ctrl+Alt+N)出现中文的乱码
- laravel 解决 sql mode only_full_group_by
- 永久破解pycharm,golang,IDEA开发工具
- PAT (Basic Level) Practice (中文)1070 结绳 (25 分) (优先队列)
- 原生js判断设备类型
- STL-vector-set_difference B - 人见人爱A-B
- http接口的调用
- C语言运算符的优先级与结合性
- 基于Python的face_recognition库实现人脸识别