PAT Basic 1027. 打印沙漏

PAT Basic 1027. 打印沙漏

1. 题目描述:

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

*****
 ***
  *
 ***
*****

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

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

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

19 *

5. 输出样例:

*****
 ***
  *
 ***
*****
2

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

这里根据题目描述得出最大行数即可,当时是推公式直接把行数解出来了。。。结果因为sqrt()算出来的行数是个浮点数,涉及到类型转换,导致我testpoint2没过,又额外加了个判断条件。

其实直接一个while循环统计出最大行数就好了,这样写就是简单问题复杂化,不过可以直接解析的算出来行数。

My Code:

#include <stdio.h>
#include <math.h>

int main(void)
{
    int chNum = 0;
    char character;
    int count = 0, root1 = 0, n = 0;
    
    scanf("%d %c", &chNum, &character);
    
//     1 + (3 + 5 + ... + n) * 2 == chNum
//     3 + 5 + ... + n == (chNum - 1)/2
        
//     3 + 5 + 7
//     7 + 5 + 3

//     left == (n+3) * ((n-3)/2+1) / 2
//          == (n+3) * (n-1)/2  / 2
//          == (chNum - 1)/2
//     (n+3)(n-1) / 2 == chNum-1
//     n^2 + 2n -3 == (chNum-1) * 2
//     n^2 + 2n -3 -(chNum-1)*2 == 0
//     get n1, n2, choose bigger one. !!! root1 must bigger
    
    n = -3 - (chNum-1)*2;
    root1 = (-2 + sqrt(4-4*n)) / 2;
    //root2 = (-2 - sqrt(4-4*n)) / 2;
    
    if(root1 % 2 == 0) // beacuse double value of sqrt() to int, the floor round will make root1 even, testpoint2 reject.
        root1--;
    
    count = root1;
    
    while(count >= 1)
    {
        for(int i = root1-count; i>0; i-=2)
        {
            printf(" ");
        }
        for(int i = count; i>0; i--)
        {
            printf("%c", character);
        }
//         for(int i = root1-count; i>0; i-=2)
//         {
//             printf(" ");
//         }
        printf("\n");
        
        count -= 2;
    }
    
    count = 3;    
    while(count <= root1)
    {
        for(int i = root1-count; i>0; i-=2)
        {
            printf(" ");
        }
        for(int i = count; i>0; i--)
        {
            printf("%c", character);
        }
//         for(int i = root1-count; i>0; i-=2)
//         {
//             printf(" ");
//         }
        printf("\n");
        
        count += 2;
    }
    
    printf("%d\n", chNum - ((root1+3)*(root1-1)/2) -1);
    
    
    return 0;
}
posted @ 2023-03-13 17:22  十豆加日月  阅读(19)  评论(0编辑  收藏  举报