L1-002. 打印沙漏(C++)
2016-05-19 17:48
501 查看
题目地址:https://www.patest.cn/contests/gplt/L1-002
题目要求:
我的笨方法:
我想采用分解的策略,因为直觉告诉我一口气打印出沙漏可能会出现问题。读完题目后联想到打印金字塔的问题,所以将沙漏分解成一个倒置的三角形和一个正放着的三角形,中间的一个符号重复,所以单独处理。目前,分成三个部分,准备分三步打印出这个东西。
根据题目就中的关于沙漏形状的提示,我得出其中一个三角形每行符号数目的公式2n-1,求正放的或者倒置的三角形符合等差数列求和,两个加在一起再减去中间的一,就可以得出标准沙漏形状的符号数通项公式:2n²-1。
不会等差数列求和的,参照这里 http://baike.baidu.com/view/1149635.htm
整体的思路有了,接下来就是根据思路确定需要多少变量了。慢慢来就好,再有就是,每做出一部分之后就可以试验一下效果,不要等到基本写完再测,很忌讳这么答题,尤其是面对难题时,这样经常会崩溃!一般来说写了一个阶段以后可以审查和走查。
关于单元测试参照这里
http://baike.baidu.com/linkurl=e6txyYNsvVGvcovW1Fdc4K95b2W4YMrJCrOSqiEycptq_7t8ulXP8Qk_1xpNRvhGtqQ97Q2QMPJ_SlgCYOKBAq
我的烂代码:
题目要求:
我的笨方法:
我想采用分解的策略,因为直觉告诉我一口气打印出沙漏可能会出现问题。读完题目后联想到打印金字塔的问题,所以将沙漏分解成一个倒置的三角形和一个正放着的三角形,中间的一个符号重复,所以单独处理。目前,分成三个部分,准备分三步打印出这个东西。
根据题目就中的关于沙漏形状的提示,我得出其中一个三角形每行符号数目的公式2n-1,求正放的或者倒置的三角形符合等差数列求和,两个加在一起再减去中间的一,就可以得出标准沙漏形状的符号数通项公式:2n²-1。
不会等差数列求和的,参照这里 http://baike.baidu.com/view/1149635.htm
整体的思路有了,接下来就是根据思路确定需要多少变量了。慢慢来就好,再有就是,每做出一部分之后就可以试验一下效果,不要等到基本写完再测,很忌讳这么答题,尤其是面对难题时,这样经常会崩溃!一般来说写了一个阶段以后可以审查和走查。
关于单元测试参照这里
http://baike.baidu.com/linkurl=e6txyYNsvVGvcovW1Fdc4K95b2W4YMrJCrOSqiEycptq_7t8ulXP8Qk_1xpNRvhGtqQ97Q2QMPJ_SlgCYOKBAq
我的烂代码:
#include<iostream> using namespace std; int main() { int n;//正整数 char mark;//符号 cin >> n >> mark; int mark_to_number;//正整数中符合沙漏数的数量 int index;//符号总数公式 2*n*n-1 的下标 int no_used_number;//没有用掉的符号数 //确定正整数最接近哪一项,并记录没有用掉的符号数 for (int i = 1; i <= 23; i++) { mark_to_number = 2 * i*i - 1; if (n==mark_to_number)//N与标准数正好相等的情况 { index = i; no_used_number = 0; break; } else if (n<mark_to_number)//如果比这一次的标准符号数少说明比上一个标准数多一些 { index = i - 1; no_used_number = n - 2 * (i - 1)*(i - 1) + 1; break; } } //打印上半部分 for (int i = 2*index-1; i >1 ; i=i-2) { //打印空格 int blank_number = index-(i + 1) / 2; for (int k = 0; k < blank_number; k++) { cout << ' '; } //打印符号 for (int j = 0; j < i; j++) { cout << mark; } cout << endl; } //打印中间 for (int i = 0; i < index-1; i++) { cout << ' '; } cout << mark << endl; //打印下半部分 for (int i = 3; i <= 2*index-1; i=i+2) { //打印空格 int blank_number = index-(i + 1) / 2; for (int k = 0; k < blank_number; k++) { cout << ' '; } //打印符号 for (int j = 0; j < i; j++) { cout << mark; } cout << endl; } cout << no_used_number << endl; //system("pause"); return 0; }
相关文章推荐
- C/C++的字符串操作(二)
- C语言随记(一)—函数
- c/c++原子操作 接口函数 自查文档
- C/C++的字符串操作(一)
- C++第六次作业 项目1 项目4
- C语言中memset函数详解
- 剖析c++(二) 内置类型的内存形式
- 剖析c++(一) 进程内存空间布局
- C++笔记
- 第12周项目1--实现复数类中的运算重载(1)
- C/C++的一些杂项
- 模板
- 亚像素图像图像平移
- 常对象及常成员及静态数据成员和静态成员函数的学习内容。
- C++拷贝构造函数(深拷贝,浅拷贝)
- 杭电1000、1001C语言,通过。
- c/c++代码中执行cmd命令
- C语言常见字符串面试题
- 【C/C++】C++基础知识查漏补缺
- C语言字符串操作函数