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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM