题目链接:
题目:
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:
19 *
输出样例:
***** *** * *** ***** 2
解题思路:
先计算出输入的字符的个数可以构成一个拥有几行,每行有多少个字符的沙漏;
计算完成先打印出字符,可以先打印上面一半的三角形,再打印下面一半;
最后处理字符前面空格的输出
注意:
当输入的n小于7时只能构成一个一行只有一个字符的沙漏,所以当输入小于7时要进行特别处理。
还有,所有字符使用完,剩余字符的个数依旧要输出,输出0
解题代码:
#include <bits/stdc++.h> using namespace std; //存放每行需要几个字符,只存沙漏一半的三角形 //另一半倒序遍历即可 int nums[1000]; int index1 = 0;//输入的字符个数 int remain = 0;//保存剩余的字符个数 //得到沙漏每行需要几个字符 void getNum( int n ) { int num = 1; while ( num <= n ) { nums[index1++] = num; if ( num==1 ) { n -= num; } else { //有上下俩半的三角形 n -= num*2; } //等差数列,差为2 num += 2; } //剩余的字符个数 remain = n; } int main() { int n; cin >> n; char c; cin >> c; // n小于7的情况,只能输出一个 // n小于7只能构成一个一行(一个字符)的沙漏 if ( n<7 ) { cout << c << endl << n-1; return 0; } getNum(n); //输出字符 //上面一半 for ( int i=index1-1; i>=0; i-- ) { for ( int j=0; j<index1-i-1; j++ ) { cout << " "; } for ( int j=0; j<nums[i]; j++ ) { cout << c; } cout << endl; } //下面一半 for ( int i=1; i<index1; i++ ) { for ( int j=0; j<index1-i-1; j++ ) { cout << " "; } for ( int j=0; j<nums[i]; j++ ) { cout << c; } cout << endl; } //剩余的字符个数 cout << remain << endl; }