本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:19 *输出样例:
***** *** * *** ***** 2//这道题考察对变量和循环的控制,首先要算出一共有多少行,然后还要算出每个行要输出多少个括号,要细心 #include <iostream> using namespace std; void printRow(int blank, int fill, char symbol){ while (blank--){ cout << " "; } while (fill--){ cout << symbol; } cout << endl; } int main(int argc, const char * argv[]) { int num, symbol_of_row = 3, cnt = 1, row = 0; char symbol; cin >> num >> symbol; while (true){ cnt += 2 * symbol_of_row; row++; if (cnt == num){ break; } else if (cnt > num){ cnt -= 2 * symbol_of_row; symbol_of_row -= 2; row--; break; } symbol_of_row += 2; } int j = row; for (int i = symbol_of_row; i>0; i -= 2){ printRow(row - j, i, symbol); j--; } j++; for (int k = 3; k <= symbol_of_row; k += 2){ j++; printRow(row - j, k, symbol); } cout << num - cnt << endl; return 0; }