# プログラム例1 puts "私の名前は学芸花子、学籍番号はAB-1234です" # プログラム例2 myname = "学芸花子" # 名前を変数 myname へ代入 mycode = "AB-1234" # 学籍番号を変数 mycode へ代入 printf("私の名前は%s、学籍番号は%sです", myname, mycode) # 清書して印字
(注: 以下の記述で / は整除を意味します)
一般にある自然数 x に対して
i(p,n!) = n/p + n/p2 + n/p3 + ...となります(つまり n 以下の、 p の倍数の数 + p2 の倍数の数 + ... のこと)。 また p1 < p2 であれば
n/p1 + n/p22 + ... > n/p2 + n/p22 + ...となります(分母が大きければ分数全体は小さくなる)。すなわち
i(2,n!) > i(5,n!)ですから、結論としては
z(n!) = i(5,n!) = n/5 + n/52 + n/53 + ...となります(アルゴリズム2)。
プログラム例
def fact(n) # 階乗の計算 s = 1 while n > 0 s *= n n -= 1 end return s end # アルゴリズム1 # n! を 10 で割り続ける def z1(n) i = 0 nn = fact(n) while nn % 10 == 0 i += 1 nn /= 10 end return i end # アルゴリズム2 # n/5 + n/25 + n/125 + ... を計算する def z2(n) i = 0 d = 5 while n/d > 0 i += n/d d *= 5 end return i end # チェック n=gets.to_i puts fact(n) puts z1(n) puts z2(n)
「エラトステネスの篩」により「n 未満の素数の一覧」を生成(*1)して、 その総和を計算(*2)する、という素朴な方針(アルゴリズム)でプログラムを作ります。
# 添字 0〜n-1 について、要素が # - 素数ならば true # - 合成数ならば false # となっている配列を生成する関数 def sieve_of_eratosthenes (n) p = [false, false] # 0,1 は合成数 for i in 2 ... n # 2 以上は素数とまず仮定 p[i] = true end for i in 2 ... n if p[i] # i は素数である d = 2*i while d < n # 素数の倍数は合成数 p[d] = false d += i end end end return p end # 配列 a の要素が true である添字 # について総和を計算する関数 def summarize (a) s = 0 for i in 0 ... a.length if a[i] s += i end end return s end puts summarize(sieve_of_eratosthenes(gets.to_i))
解答例: なし