1027. 打印沙漏(20)

描述

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

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

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

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

输入格式:

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

输出格式:

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

样例.jpg

C语言:

#include <stdio.h>

int get_max_line(int n);
void print(int space_size, char ch, int ch_size);

int main(void)
{
    int n;
    char ch;
    scanf("%d %c", &n, &ch);
//  printf("intput: %d %c\n", n, ch);

    // 获取第一行字符数
    int max_line = get_max_line(n);
    
    // 输出字符
    for (int i=max_line; i>=1; i-=2){
        print((max_line-i)/2, ch, i);
    }
    for (int i=3; i<=max_line; i+=2){
        print((max_line-i)/2, ch, i);
    }
    
    // 输出余数
    int sum = 0;
    for (int i=1; i<=max_line; i+=2) {
        int t = (i == 1 ? i : 2*i);
        sum += t;
    }
    int r = n - sum;
    printf("%d", r);

}

// 第一个行字符
int get_max_line(int n)
{
    if (n == 1) {
        return 1;
    }
    int sum = 0;
    int i;
    for (i=1;sum<n; i+=2) {
        int t = (i == 1 ? i : 2*i);
        sum += t;
    }
    return i-4;
}

// 打印字符
void print(int space_size, char ch, int ch_size)
{
    for (int i=0; i<space_size; i++) {
        printf(" ");
    }
    for (int i=0; i<ch_size; i++){
        printf("%c", ch);
    }
    printf("\n");
}
1027.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 传送门 https://pintia.cn/problem-sets/994805260223102976/pro...
    Rush的博客阅读 6,687评论 0 0
  • 我的PAT系列文章更新重心已移至Github,欢迎来看PAT题解的小伙伴请到Github Pages浏览最新内容。...
    OliverLew阅读 8,451评论 0 1
  • 一.本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ***** *** ...
    城东那个小丑阅读 5,293评论 2 2
  • 不知道是不是有这么一种情况,就是越想睡越睡不着,曾几何时,总是一种非常奇怪的思维与想法,我要熬夜,我要熬夜, 我不...
    哈幸运儿阅读 1,603评论 0 0
  • 在静心湖的北面有一个兰嫣亭,兰嫣亭的左侧种了许多水仙花,花开时这里有着别样一番的风味。静候亭中,遥望静心湖,在湖的...
    沉心阁阅读 3,379评论 0 2

友情链接更多精彩内容