[プロジェクト・オイラー]
なんとか10問以上は飽きずに解いていきたい…
multiple = 倍数
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
+
|
解答
|
|
|
puts (1...1000).select{|n| n % 3 == 0 or n % 5 == 0}.inject(:+)
|
Wikipedia - フィボナッチ数列
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
数列の項の値が400万以下の, 偶数値の項の総和を求めよ.
Note:この問題は最近更新されました. お使いのパラメータが正しいかどうか確認してください.
+
|
解答
|
|
|
- フィボナッチ数列(再帰でも十分間に合う)を実装して偶数値の項の総和を求める
def fib(n)
if n == 1
1
elsif n == 2
2
else
fib(n-2) + fib(n-1)
end
end
n = 1
s = 0
ans = 0
while true
ans = fib(n)
break if ans > 4000000
s += ans if ans % 2 == 0
n += 1
end
puts s
|
prime factor = 素因数
13195 の素因数は 5, 7, 13, 29 である.
600851475143 の素因数のうち最大のものを求めよ.
+
|
解答
|
|
|
- 与えられた数をnとすると、 2〜√n までの因数で割り切れるか試し割りをする
N = 600851475143
max = Math.sqrt(N).round
primes = Array.new(max, 0)
test = 1
for pn in 2..max
c = 0
while N % pn**c == 0
c += 1
end
c = c-1
primes[pn-1] = c
test = test * (pn**c)
#puts "test: #{test} = #{pn}^#{c}"
break if test == N
end
primes.each_with_index do |p,i|
puts "#{i+1} = (#{p})" if p != 0
end
t = primes.map.each_with_index do |pf,i|
i+1 if pf != 0
end.compact.max
puts "max prime number is: #{t}"
|
palindromic = 回文
左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
では, 3桁の数の積で表される回文数の最大値を求めよ.
+
|
解答
|
|
|
- 3桁の整数999~100までのリストを2つ作り、掛け合わせて3桁の数の積を作る。それのうち回文数である最大値を求める。
def palindrome?(number)
n = number.to_s
if n.length % 2 == 0
n[0...n.length/2] == n[n.length/2..n.length].reverse
else
n[0...n.length/2-1] == n[n.length+1/2..n.length].reverse
end
end
digit3_a_array = 999.downto(100).to_a
digit3_b_array = digit3_a_array.dup
palindrome_arr = []
for digit3_a in digit3_a_array
for digit3_b in digit3_b_array
digit6 = digit3_a * digit3_b
palindrome_arr << digit6 if palindrome?(digit6)
end
end
puts palindrome_arr.max.to_s
|
2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.
では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.
+
|
解答
|
|
|
- 愚直にいくと、1から順にインクリメントして、それが1 から 20 までの整数全てで割り切れるかどうかをチェックすればよい
n = 1
ans = nil
while true
if 1.upto(20).all?{|i| n % i == 0}
ans = n
break
end
n += 1
end
puts ans
|