• 自测-1 打印沙漏


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

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

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

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

    输入格式:

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

    输出格式:

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

    输入样例:

    19 *
    

    输出样例:

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

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int num = 0, leftNum = 0,i = 1, n = 1, j = 0;
        char ch;
        scanf("%d %c",&num, &ch);
        // 边界判断
        if(num <= 0 || num > 1000){
            return 0;
        }
        // 确定总行数i,满足(i+2)*2+n=最大可排列数
        while(((i+2)*2 + n) < num){
            i += 2;
            n = i*2 + n;        
        }
        //特殊值处理
        if(num == 1){
            printf("%c
    ",ch);
        }else{
            leftNum = num - n;
            //打印沙漏
            for(;j < i; j++){
                int m = 0;
                //先打印空格,满足规律先正序后倒序
                for(;m < (j <= i/2 ? j : i - j - 1);m++){
                    printf(" ");
                }
                m = 0;
                //打印符号,满足规律2*n+1先倒序后正序
                for(;m < abs(j - i/2)*2 + 1;m++){
                    printf("%c", ch);
                }     
                printf("
    ");
            }
        }
        printf("%d
    ",leftNum);
        return 0;
    }
  • 相关阅读:
    LeetCode 172:阶乘后的零
    Ubuntu12.04更新出现 The system is running in low-graphics mode解决方法
    不加参数的存储过程
    PCC-S-02201, Encountered the symbol "DB_USER_OPER_COUNT"
    该思考
    关于export环境变量生存期
    会话临时表 ORA-14452
    如何创建守护进程--及相关概念
    2014年10月末
    6个月
  • 原文地址:https://www.cnblogs.com/baichangfu/p/7130608.html
Copyright © 2020-2023  润新知