自然数 n に対して,n が奇数なら 3 をかけて 1 を加える。偶数なら 2 で割る。
この処理を繰り返すといずれは 1 になる。
これを,n = 99999999999999999999999999999999999999999999999999 についてやってみよという問題。
ただし,「言語は Object Pascal(Delphi) 。Windows 向けコンソールプログラムで,ソースコードは、50 行以内,かつ,Delphi XE7 または Appmethod に標準搭載されているデータ型,クラス,ライブラリのみを使用」という条件がついている。
でもまあ,そんな条件なんかどうでもよいでしょ。
library(gmp)
n = as.bigz(paste(rep("9", 50), collapse=""))
repeat {
if (n %% 2 == 1) {
n = 3 * n + 1
} else {
n = n %/% 2
}
print(n, initLine=FALSE)
if (n == 1) break
}
で確かめられるんだから。
注意点は,演算を Big Integer ('bigz') でやるんだけど,2 で割るときに n %/% 2 としないと,結果が Big Rational ('bigq') になってしまうよというところ。
gmp を使わないでもできるだろう。
※コメント投稿者のブログIDはブログ作成者のみに通知されます