算額あれこれ

算額問題をコンピュータで解きます

2 進数で表したとき,ビットが 1 の個数が等しい連続する整数の組数

1~2014 までの数を 2 進数で表したときに,連続する 2 数の 1 の個数が同じであるようなペアは何組存在するか

連続する数のうち,(1, 2),(5, 6), (9, 10), ...
のように, (4(i-1)+1, 4(i-1)+2),i = 1, 2, ... の 2 数の 1 の個数が等しくなる。

よって,n までには ifelse( (n-1)%%4, (n-1)%/%4+1, (n-1)%/%4) 組存在する

n = 2014 ならば,
> n = 2014
> ifelse( (n-1)%%4, (n-1)%/%4+1, (n-1)%/%4)
[1] 504

504 組存在する

愚直なプログラムを書いて確かめるなら,

> func = function(n) {
+     count = 0
+     repeat {
+         count = count + n %% 2
+         n = n %/% 2
+         if (n == 0) return(count)
+     }
+ }
> sum(diff(sapply(1:n, func)) == 0)
[1] 504