自测-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;
}
原文地址:https://www.cnblogs.com/baichangfu/p/7130608.html