本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
***** *** * *** *****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入格式:
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。
输出格式:
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
输入样例:19 *输出样例:
***** *** * *** ***** 由题意可知: 1.需打印出对应行数的沙漏 2.输出剩下没用掉的符号数 1.当沙漏行数为1 3 5 行时,对应所需符号数为1 7 17, 由归纳法知:设沙漏行数为row,则构成沙漏所需符号数为:(2*row*row - 1) 2.剩下没用掉的符号数 = 输入的数 - 构成沙漏所需符号数 可以通过循环遍历得出,在通项(*2*n*n - 1)中,刚好小于输入的数的那一项#include <stdio.h> int get_offline(int num); void print(int row, char ch); int main() { int num; char ch; int offline; scanf("%d %c",&num, &ch); offline = get_offline(num); print(offline, ch); printf("%d\n",num-(2*offline*offline-1)); return 0; } int get_offline(int num) // 得出所输入数 num在通项中的前一个 { int i; for (i = 0; (2*i*i - 1) <= num; i++) { } return i-1; } void print(int row, char ch) { int _temp; int temp = _temp = row; int j; while(row > 0) // 输出沙漏上半层顶至最中间一行 { while (temp - row > 0) { printf(" "); temp--; } temp = _temp; for(j = 0; j < 2*row - 1; j++) { printf("%c",ch); } printf("\n"); row--; } row = 1; // 从最中间一行下一行输出沙漏下半层底 while(row < temp) { while (temp - (row+1) > 0) { printf(" "); temp--; } temp = _temp; for (j = 2*row+1; j > 0; j--) { printf("%c",ch); } printf("\n"); row++; } }