問題
把年月日表示爲 YYYYMMDD 這樣的 8 位整數,而後把這個整數轉換成二進制數而且逆序排列,再把獲得的二進制數轉換成十進制數,求與原日期一致的日期。求得的日期要在上一次東京奧運會(1964 年 10 月 10 日)到下一次東京奧運會(預約舉辦日期爲 2020 年 7 月 24 日)之間。
例)日期爲1966年7月13日時
① YYYYMMDD格式→ 19660713
② 轉換成二進制數→ 1001010111111111110101001
③ 逆序排列→ 1001010111111111110101001
④ 把逆序排列獲得的二進制數轉換成十進制數→ 19660713
……回到1966年7月13日(最初的日期)app
package main import ( "time" "fmt" "strconv" ) func reverse(s string)string{ sLen := len(s) var sSliRev []byte for i:=sLen-1;i>=0;i--{ sSliRev = append(sSliRev,s[i]) } return string(sSliRev) } func judge(s string)bool{ n,err := strconv.Atoi(s) if err != nil{ panic(err) } sBin := fmt.Sprintf("%b", n) sBinRev := reverse(sBin) if sBin == sBinRev{ return true }else{ return false } } func main(){ start,err := time.Parse("20060102", "19641010") if err != nil{ fmt.Println("get start time failed, ", err) return } startUnix := start.Unix() end,err := time.Parse("20060102", "20200724") if err != nil{ fmt.Println("get start time failed, ", err) return } endUnix := end.Unix() days := (endUnix - startUnix) / 86400 var i int64 for i=0;i<=days;i++{ dateUnix := startUnix + i * 86400 date := time.Unix(dateUnix,0).Format("20060102") if judge(date){ fmt.Println(date) } } }
結果:ide
19660713 19660905 19770217 19950617 20020505 20130201
時間的遍歷稍麻煩一些,進制轉換、逆序,而後判斷篩選。code