您的位置:首页 > 编程语言 > C语言/C++

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

我的烂代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: