【问题标题】:I want to calculate the last 20 leap year for which I have written this code, can this code be further optimized [closed]我想计算我编写此代码的最后 20 个闰年,是否可以进一步优化此代码 [关闭]
【发布时间】:2020-10-14 10:35:33
【问题描述】:
package javaHM;

import java.util.*;

public class LeapYear {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner obj = new Scanner(System.in);
        System.out.println("Enter Starting Year");
        int year = obj.nextInt();
            leapFor(year);
            
        obj.close();

    }

    public static int leapFor(int year) {
        int counter = 0, i;
        for (i = year; i >= 1; i--) {
            if ((i % 4 == 0) && i % 100 != 0 || i % 400 == 0) {
                System.out.println(i);
                counter++;

            }
            if (counter == 20)
                break;
        }
        return i;

    }
}

我想优化这部分代码,请帮帮我

【问题讨论】:

  • @rzwitserloot 你确定吗?
  • “此代码能否进一步优化”以 1 为增量循环没有什么意义。以 4 为增量循环(从 year / 4 * 4 开始)。
  • 我只会使用 java.time 包中的静态方法 Year.isLeap()。它会简化你的代码。
  • @rzwitserloot 好的,我正在查看维基百科。 en.m.wikipedia.org/wiki/2000 2000 (MM) 是一个世纪 闰年,从公历的星期六开始,即共同纪元 (CE) 和纪元 (AD) 指定的第 2000 年,即第 1000 年以及第二个千年的最后一年,20 世纪的第 100 年和最后一年,以及 2000 年代的第 1 年。
  • @rzwitserloot 你错了。能被 400 整除的世纪年是闰年。 2100 可以被 4 整除,但不是闰年,因为它不能被 400 整除。

标签: java optimization


【解决方案1】:

您的函数在每次迭代时都会执行 I/O。 I/O 很慢,所以效果最大的优化就是将输出累加到缓冲区中,并且只打印一次。对算术的任何更改都不会产生有意义的差异。

public static int leapFor(int year) {
    int counter = 0, i;
    StringBuilder output = new StringBuilder(20*(4+1));
    for (i = year; i >= 1; i--) {
        if ((i % 4 == 0) && i % 100 != 0 || i % 400 == 0) {
            output.append(i).append('\n');
            counter++;

        }
        if (counter == 20)
            break;
    }
    System.out.print(output);
    return i;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多