Java L1-002 打印沙漏【自用笔记】

思路

  • 计算我们能打印出的最大沙漏所用的符号个数(以下称为 “有效符号数”
  • 根据上一步得到的 有效符号数 ,打印图案

难点

1. 如何计算 有效符号数?

模拟人工计算过程

  • 判断题目给出的符号数是否大于 1 ?是否大于 7 ?是否大于 17 ?…以此类推,直到我们发现给出的符号数小于某个值,这时就可以得到 有效符号数

2. 如何打印图案?

仔细观察不难发现,其实每行图案都是由一定的空格 + 题目给定的特殊符号构成的;
想要正确打印图案,就需要确定每行空格数 、特殊符号数

  • 确定每行空格数:相邻两行相差2个符号,每相差一个符号,开头就需要多加一个空格;因此,“(最后一行符号数 - 当前行符号数) / 2” 就可得到当前行开头空格数
  • 确定每行特殊符号数:只要确定了最长那一行符号数,每一行符号数就都确定了。

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String symbol = sc.next();
        if (n == 0) {
            System.out.println(0);
            return;
        }
        int numOfSymb = 1;
        int augment = 6;
        while (n >= numOfSymb) {
            numOfSymb += augment;
            augment += 4;
        }
        numOfSymb -= (augment - 4);
        int remain = n - numOfSymb;
        int lastNum = (augment - 4) / 2 - 2;
        int curNum= lastNum;
        boolean flag = false;
        while(numOfSymb > 0){
            if(curNum == 1)flag = !flag;
            for (int i = 0; i < (lastNum - curNum) / 2; i++) {
                System.out.print(" ");
            }
            for (int i = 0; i < curNum; i++) {
                System.out.print(symbol);
            }
            numOfSymb -= curNum;
            System.out.println();
            if(flag) curNum += 2;
            else curNum -= 2;
        }
        System.out.println(remain);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值