!Mac OS X-10.15.7 !ruby-2.7.1p83$
課題
授業の最終課題でgoogle recruit の課題が出たのでやってみた.
- e(自然対数の底)の値で連続する10桁の数のうち,最初の素数を求めよ
作成したプログラム
# coding: utf-8
require "prime"
def check_prime(num)
return Prime.prime?(num)
end
def make_num
e = "2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457\
13821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907\
632338298807531952510190"
num = e.delete(".")
i = 0
loop{
slice_num = num.slice(i..i+9).to_i
puts slice_num
if check_prime(slice_num) == true
puts "素数です"
break
end
i = i+1
}
end
make_num
解説
素数判定する関数と10桁の整数を作成する関数を作成
素数判定にはprimeっていうモジュールがあったからインポートしてそれを使用.値を入力すると素数かどうかをtrue かfalseで返してくれる
あとはループして10桁ずつ変数に入れて判定するだけ
めっちゃ簡単やったけど,グーグルの試験の時にはprimeモジュールあったんかな?なかったら若干反則な気がするけどまあいいか
発展課題
f(1)=7182818284
f(2)=8182845904
f(3)=8747135266
f(4)=7427466391
f(5)=__________
規則性見つけて当てはまる数字を入れるらしい
解説
問題に表示されている数字はすべて10桁でe(自然対数の底)に含まれる数字である。
さらに、各桁の合計が49になってる…
なので、e(自然対数の底)の値で連続する10桁の数のうち,各桁の和が49になる値を探す
作成したプログラム
# coding: utf-8
def count_digits(num)
num.to_s.length
end
def check_49(num)
sum = 0
for j in 1..10 do
a = num % 10
sum = sum + a
num = num / 10
end
if sum ==49
return 1
end
end
def main
sum = 0
e = "2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763\
2338298807531952510190"
num = e.delete(".")
len = count_digits(num)
for i in 0..len-10 do
slice_len = num.slice(i..i+9)
slice_num = slice_len.to_i
if check_49(slice_num)==1
puts slice_len
end
end
end
main
実行結果は以下の通り
7182818284
8182845904
8747135266
7427466391
5966290435
2952605956
これより答えは5966290435
もうちょっときれいにコードを書きたいけど時間がないからこのくらいでいいか
参考にしたサイト
- source ~/grad_members_20f/members/okamoto0910/article/google.org