【PAT】自测1 打印沙漏
2015-06-14 10:51
597 查看
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
输出样例:
参照网上代码自己写了一些。虽然可以实现,不过似乎写的比较复杂。
代码如下:
printSandglass函数实现了打印沙漏并返回未打印的元素个数。
首先除2后开放取得打印一半的沙漏的行数。
以行数为条件循环,在循环体中分别进行两次循环打印空格和给定字符。
分别打印输出沙漏的上下两部分。
下一部分因为是从3个符号开始,所以行数-1。
最后通过等差数列求和公式求出一共使用了多少个字符。并用全部字符数减去使用字符数求得多余字符数。
等差数列求和公式 Sn = na1 + n(n - 1)d/2
执行结果如下:
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
*****
参照网上代码自己写了一些。虽然可以实现,不过似乎写的比较复杂。
代码如下:
#include <stdio.h> #include <math.h> int printSandglass(int num, char value) { int rowSize = sqrt((num + 1) / 2); int extraNum = num; for (int i = 0; i < rowSize; i++) { for (int m = 0; m < i; m++) { printf(" "); } for (int n = 2 * (rowSize - i - 1) + 1; n > 0; n--) { printf("%c", value); } printf("\n"); } for (int j = 0; j < rowSize - 1; j++) { for (int m = j; m < rowSize - 2; m++) { printf(" "); } for (int n = 0; n < 2 * j + 3; n++) { printf("%c", value); } printf("\n"); } if (rowSize > 1) { extraNum = num - (1 + 2 * (rowSize + rowSize * rowSize - 4)); } else if (rowSize > 0) { extraNum -= 1; } return extraNum; } int main(int argc, const char * argv[]) { int num; char charValue; printf("insert: "); scanf("%d %c", &num, &charValue); printf("\n"); int extraNum = printSandglass(num, charValue); printf("%d\n", extraNum); return 0; }
printSandglass函数实现了打印沙漏并返回未打印的元素个数。
首先除2后开放取得打印一半的沙漏的行数。
以行数为条件循环,在循环体中分别进行两次循环打印空格和给定字符。
分别打印输出沙漏的上下两部分。
下一部分因为是从3个符号开始,所以行数-1。
最后通过等差数列求和公式求出一共使用了多少个字符。并用全部字符数减去使用字符数求得多余字符数。
等差数列求和公式 Sn = na1 + n(n - 1)d/2
执行结果如下:
insert: 17 *
***** *** * *** *****0
相关文章推荐
- Linux C函数参考手册(PDF版)
- Lua教程(十七):C API简介
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C#实现打造气泡屏幕保护效果
- C/C++数据对齐详细解析
- 数据结构之Treap详解
- C 语言基础教程(我的C之旅开始了)[三]
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- C字符串操作函数实现方法小结
- C/C++ 宏详细解析
- C/C++实现对STORM运行信息查看及控制的方法
- 用C#生成不重复的随机数的代码
- JavaScript数据结构和算法之图和图算法
- 在c和c++中实现函数回调
- 浅析C/C++中被人误解的SIZEOF
- C 语言基础教程(我的C之旅开始了)[六]