Problem 3

13195 の素因数は 5、7、13、29 である。

600851475143 の素因数のうち最大のものを求めよ。

Problem 3 - PukiWiki

Ruby

a = 600851475143
x = []

while a != 1 do
  for i in 2..a do
    if a%i == 0 then
      x << i
      a = a/i
      break
    end
  end
end

puts x.max

何も考えないで書いたらRubyらしさってなんだろ〜みたいなコードになってしまった。

R

a <- 600851475143
x <- NULL

while(a != 1) {
  i <- 2
  while(i <= a) {
    if(a%%i == 0) {
      x <- append(x, i)
      a <- a/i
      break
    }
    i <- i+1
  }
}

print(max(x))

Rubyのをほぼそのまま移植。
最初は、

while(a != 1) {
  for(i in 2:a) {
    if(a%%i == 0) {
      x <- append(x, i)
      a <- a/i
      break
    }
  }
}

って書いてたんだけど、ベクトルが長すぎるって怒られるなどしたのでやむなくwhileで書き直すなどした。2:600851475143が無理だったのね…

Haskell

factorize n (x:xs)
  | (mod n x) == 0 = x:factorize (div n x) (x:xs)
  | n == 1 = []
  | otherwise = factorize n xs

main = print $ maximum $ factorize 600851475143 [2..]

めちゃくちゃ試行錯誤した。Haskell的な(というか関数型的な)考え方が全然身に付いていないので苦労しまくり。もっと綺麗に書けそうな気はしている。