天梯赛锦集-----第一天打卡
L1-002 打印沙漏 (20 分)
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
2
前言
首先分析题目,我们可以知道,这是一道简单题目;
运用到高中数学知识:等差数列
等差数列:an = a1 + (n - 1) * q;
求Sn:Sn = (a1 + an) * n / 2;
所以:这个题目的关键就在于:等差数列;进而分析出上面几层循环,下面几层循环;
二、参考代码
##1.我首先是经过手写,然后再通过编译器修改的;还好最后成功了。还是很开心的。哈哈哈。
代码如下(示例):
#include <cmath>
#include <iostream>
using namespace std;
void F(int x, char sy)
{
for (int i = 1; i <= x; i++)
{
cout << sy;
}
}
int main()
{
int n;
cin >> n;
char z;
cin >> z;
int m = sqrt((n + 1) / 2);
for (int i = 0, j = 2 * m - 1; i < m && j >= 1 ; i++, j -= 2)
{
F(i, ' ');
F(j, z);
cout << endl;
}
int x = m;
for (int i = 1, j = 3; i < m && j <= 2 * m - 1; i++, j += 2)
{
F(x - 2, ' ');
F(j, z);
cout << endl;
x--;
}
cout << n - (2 * m * m - 1) << endl;
return 0;
}
2.运行结果
代码如下(示例):
运行结果如上图;
总结
打卡第一天,冲冲冲!!!!