1217: 打印沙漏
From: 合工宣OJ http://xcacm.hfut.edu.cn/problem.php?id=1217
时间限制: 1 Sec 内存限制: 128 MB
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入
输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔 输出 首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
样例输入
19 *
样例输出
本题只需要循环输出判断即可,实现过程可能会有一些绕路。
1 #include <stdio.h> 2 #include<iostream> 3 using namespace std; 4 int ui(int n) 5 { 6 if(n == 1) 7 return 1; 8 else 9 return ui(n-1)+4*n-2; 10 } 11 void al(int N, int n, char c) 12 { 13 int i; 14 if(n == 1) 15 { 16 for(i = 0; i < N - n; i++) 17 printf(" "); 18 printf("%c", c); 19 printf("\n"); 20 return ; 21 } 22 else 23 { 24 for(i = 0; i < N - n; i++) 25 printf(" "); 26 for(i = 0; i < 2*n-1; i++) 27 printf("%c", c); 28 printf("\n"); 29 al(N, n-1, c); 30 } 31 } 32 void pl(int N, int n, char c) 33 { 34 int i; 35 if(n == N) 36 { 37 for(i = 0; i < 2 * n + 1; i++) 38 printf("%c", c); 39 printf("\n"); 40 return ; 41 } 42 else 43 { 44 for(i = 0; i < N - n; i++) 45 printf(" "); 46 for(i = 0; i < 2 * n + 1; i++) 47 printf("%c", c); 48 printf("\n"); 49 pl(N, n+1, c); 50 } 51 } 52 void printf_n(int n, char c) 53 { 54 int i, j; 55 56 for(i = n; i > 0; i--) 57 { 58 for(j = n - i; j > 0; j--) 59 printf(" "); 60 for(j = 0; j < 2 * i - 1; j++) 61 printf("%c", c); 62 printf("\n"); 63 } 64 for(i = 1; i < n; i++) 65 { 66 for(j = n - i; j > 1; j--) 67 printf(" "); 68 for(j = 0; j < 2 * i + 1; j++) 69 printf("%c", c); 70 printf("\n"); 71 } 72 } 73 int main(void) 74 { 75 char c; 76 int n, N, a,b; 77 while(scanf("%d %c", &N, &c)!=EOF) 78 { 79 n = 1; 80 while(N >= (a =ui(n))) 81 { 82 n++; 83 b =a; 84 } 85 n--; 86 printf_n(n, c); 87 printf("%d\n", N - b); 88 } 89 return 0; 90 } 91 92 /************************************************************** 93 Problem: 1217 94 User: 2014217052 95 Language: C++ 96 Result: 正确 97 Time:41 ms 98 Memory:1504 kb 99 ****************************************************************/