2021-03-28:定義一種數:能夠表示成若干(數量>1)連續正數和的數 。好比:5 = 2+3,5就是這樣的數 ;12 = 3+4+5,12就是這樣的數 。1不是這樣的數,由於要求數量大於1個、連續正數和 。2 = 1 + 1,2也不是,由於等號右邊不是連續正數 。給定一個參數N,返回是否是能夠表示成若干連續正數和的數 。java
福大大 答案2021-03-28:git
1.天然智慧。
滑動窗口。中點到1。L左移,和增大;R左移,和減少。若是和=N,成立。github
2.根據結果反推,找規律。
N是2次冪,不能表示成連續正數和;N不是2次冪,是連續正數和的數。golang
代碼用golang編寫。代碼以下:ide
package main import "fmt" func main() { for i := 1; i <= 64; i++ { fmt.Println(i, isMSum1(i), isMSum2(i)) } } func isMSum1(num int) bool { if num == 1 { return false } R := (num + 1) >> 1 L := R - 1 sum := R for { if sum == num { return true } else if sum > num { sum -= R R-- } else { if L == 0 { break } sum += L L-- } } return false } func isMSum2(num int) bool { return num != (num & (^num + 1)) //return num != (num & (-num)) //return (num & (num - 1)) != 0 }
執行結果以下:code