程序员的算法趣题: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