程序员的算法趣题:Q07 日期的二进制转换(Java版)

题目说明

把年月日表示为 YYYYMMDD 这样的 8 位整数, 然后把这个整数转换成二进制数并且逆序排列, 再把得到的二进制数转换成十进制数,求与原日期一致的日期。 求得的日期要在上一次东京奥运会(1964 年 10 月 10 日) 到下一次东京奥运会(预定举办日期为 2020 年 7 月 24 日)之间。 【举例】日期为 1966年 7月 13日时 ① YYYYMMDD格式→ 19660713 ② 转换成二进制数→ 1001010111111111110101001 ③ 逆序排列→ 1001010111111111110101001 ④ 把逆序排列得到的二进制数转换成十进制数→ 19660713

思路

按照步骤转化为Java代码即可

代码

public static void main(String[] args) {
    Calendar cal = Calendar.getInstance();
    cal.set(1964, 10 - 1, 10, 0, 0, 0); // 设定初始日期(月份从0开始,即0表示1月份,所以-1)
    
    Calendar end = Calendar.getInstance();
    end.set(2020, 7 - 1, 24, 24, 0, 0); // 设定终止日期
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); // 日期格式化类
    
    while (cal.before(end)) {
        // 1.将Calendar --> Date --> yyyyMMdd格式
        String date = sdf.format(cal.getTime());
        // 2.转为二进制
        String s = Integer.toBinaryString(Integer.parseInt(date));
        // 3.逆序
        s = new StringBuilder(s).reverse().toString();
        // 4.转为yyyyMMdd格式
        int num = Integer.parseInt(s, 2);
        
        // 比较是否与原始日期相同
        if (("" + num).equals(date)) {
            System.out.println(date); // 相同则输出结果
        }
        
        cal.add(Calendar.DAY_OF_YEAR, 1); // 日期+1天
    }
}

结果

19660713 19660905 19770217 19950617 20020505 20130201

经验分享 程序员 微信小程序 职场和发展