PAT (Basic Level) Practise:1027. 打印沙漏

【题目链接】

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****

 ***

  *

 ***

*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****

 ***

  *

 ***

*****

2

【提交代码】

  1 #include <stdio.h>

  2 

  3 int count(n)

  4 {

  5     if(n == 1)

  6         return 1;

  7     else

  8         return count(n-1)+4*n-2;

  9 }

 10 

 11 void printf_t(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         printf_t(N, n-1, c);    

 30     }

 31 }

 32 

 33 void printf_b(int N, int n, char c)

 34 {

 35     int i;

 36     if(n == N)

 37     {

 38         for(i = 0; i < 2 * n + 1; i++)

 39             printf("%c", c);

 40         printf("\n");

 41         return ;    

 42     }

 43     else

 44     {

 45         for(i = 0; i < N - n; i++)

 46             printf(" ");

 47         for(i = 0; i < 2 * n + 1; i++)

 48             printf("%c", c);

 49         printf("\n");

 50         printf_b(N, n+1, c);

 51     }

 52 }

 53 

 54 void printf_n(int n, char c)

 55 {

 56     int i, j;

 57 

 58     for(i = n; i > 0; i--)

 59     {

 60         for(j = n - i; j > 0; j--)

 61             printf(" ");

 62         for(j = 0; j < 2 * i - 1; j++)

 63             printf("%c", c);

 64         printf("\n");     

 65     }

 66     

 67     for(i = 1; i < n; i++)

 68     {

 69         for(j = n - i; j > 1; j--)

 70             printf(" ");

 71         for(j = 0; j < 2 * i + 1; j++)

 72             printf("%c", c);

 73         printf("\n");         

 74     }

 75 }

 76 

 77 

 78 int main(void)

 79 {

 80     char c;

 81     int n, N, T1, T2;

 82 

 83     scanf("%d %c", &N, &c);

 84 

 85     n = 1;

 86     while(N >= (T1 = count(n)))

 87     {

 88         n++;

 89         T2 = T1;

 90     }

 91     n--;

 92 

 93     //printf_t(n, n, c);

 94     //printf_b(n-1, 1, c);

 95     //printf("%d", N - T2);

 96   

 97     printf_n(n, c);

 98     printf("%d", N - T2);

 99   

100     return 0;

101 }

 

你可能感兴趣的:(level)