お題
{e(自然対数の底)の値で連続する10桁の数のうち,最初の素数}
をrubyで求めよ.ただし,e(自然対数の底)は200桁までで
2.71828182845904523536028747135266249775
7247093699959574966967627724076630353547
5945713821785251664274274663919320030599
2181741359662904357290033429526059563073
81323286279434907632338298807531952510190
である.これをテキストにコピーして読みこませよ.
解説
テキストファイルの読み込み
テキストファイルの内容を全て読み込みたいのであればreadメソッドを使えばよい.読み込めているかどうか心配であれば,putを用いて表示すればよい.
exp=File.read("e.txt")
#->自然対数の底eの値200桁までの値のテキストファイルを読み込む
p exp
#->内容確認
10桁ずつ表示させる方法
whileループを用いて10桁の整数をつくる.念のため,各配列に格納されている数値を整数に変換しておく.
#ループを回して10桁の整数を自然対数から切り出していく
i=0
while(i<200)
j=0
num=0
while (j<0)
num=10*num+exp[i+j].to_i
j+=1
end
i+=1
end
素数判定
素数や素因数分解を扱うライブラリであるprimeを用いた.Prime.prime?(number)は,変数numberが素数かどうかを判別することができ,素数であればtrueを,そうでなければfalseを返す.関数find_primeは変数numを素数か否か判別するが,numが素数であればnumを返し,合成数であれば0を返すようにした.そして,返した素数はあらかじめ用意した自然対数の底に含まれる十桁の素数を格納する配列に入れていく.下記はfind_primeのコードになる.
require 'prime'
def find_prime(num)
if(Prime.prime?(num)==true) then
return num
else
return 0
end
end
プログラム
上記の解説をまとめたソースコードとなる.
require 'prime'
def find_prime(num)
if(Prime.prime?(num)==true) then
#puts 1
return num
else
#puts 0
return 0
end
end
def count_digits(num)
num.to_s.length
end
exp=File.read("e.txt")
p exp
#puts count_digits(exp)
#2重ループにして10桁の整数を切り出す
i=0
result=[]
while (i<200) do
j=0
num=0
while (j<10) do
num=10*num+exp[i+j].to_i
j+=1
end
i+=1
if (find_prime(num)!=0) then
result.push(num)
end
#puts num
#puts find_prime(num)
end
puts "素数一覧"
puts result
puts " "
puts "最初の素数"
puts result[0]
出力結果
C:\Users\nobua\M1>ruby google_recruit_problem_2.rb
"2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190"
素数一覧
7427466391
7413596629
6059563073
3490763233
2988075319
最初の素数
7427466391
参考文献
https://ist.ksc.kwansei.ac.jp/~nishitani/?GoogleEntExam
- source ~/grad_members_20f/members/NobuakiMori/google_recruit.org