どんな正の整数でも「各桁の数字を二乗して足す」という操作を繰り返すと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]))
最初に一回独立して回せば調べる数を減らせて時間短縮になるかな,と思ったけどその最初の一回が時間かかる.