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