Problem 92

どんな正の整数でも「各桁の数字を二乗して足す」という操作を繰り返すと1,もしくは89から始まるループに落ち着くらしい.知らなかった.それで,一千万以下の正の整数のうち89に到達するのはいくつあるのか?という問題.

37秒くらいかかった.一千万は多い….フォーラム見るとCでも7秒とか8秒とかかかってるし.

limit <- 1e7
pre <- 1:limit
pos <- numeric(limit)
ans <- numeric(limit)

##
while(length(unique(pre)) > 1){
  pos <- pos + (pre %% 10)^2
  pre <- pre %/% 10
}
pre.old <- pos

pre <- unique(pre.old)
pos <- numeric(length(pre))
ans <- numeric(length(pre))
pre.old2 <- pre

while(length(unique(ans)) != 2){
  while(length(unique(pre)) > 1){
    pos <- pos + (pre %% 10)^2
    pre <- pre %/% 10
  }
  pre <- pos
  ans[pre==1] <- 1
  ans[pre==89] <- 2
  pos <- numeric(length(pre))
}
sum(is.element(pre.old, pre.old2[ans==2]))

最初に一回独立して回せば調べる数を減らせて時間短縮になるかな,と思ったけどその最初の一回が時間かかる.