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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号