素因数分解を行うスクリプトです。上限は5000兆くらいです。
printメソッドの引数で" × "を使うため、マジックコメントを使っています。マジックコメントについては[2-1-5.スクリプトの中で漢字を使う]を参照してください。ただし、ruby1.8以前で実行するには、$KCODEを使用します。$KCODEについても[2-1-5.スクリプトの中で漢字を使う]を参照してください。
# coding:windows-31j
# factorize.rb
# 内容 : 素因数分解のプログラム
# Copyright (c) 2002-2015 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>ruby factorize.rb
# 入力ファイル
in1_file = open("in1.txt","r")
# 出力ファイル
out1_file = open("out1.txt","w")
#
# 定数の設定
#
table = [1,2,2,4]
# 主処理
while (data = in1_file.gets)
# 保存した割る数
w_divisor = 0
# 割る数が何乗なのかを示す値
w_power = 0
data.chomp!
number = data.to_i
out1_file.print(number," = ")
#割る数
divisor = 2
#インデックス
index = 0
#
# 素因数分解
#
while (number > divisor)
#
# 割られる数÷割る数の余り
#
surplus = number % divisor
#
# 割り切れたとき
#
if (surplus == 0)
number /= divisor
# 最初の割る数
if (w_divisor == 0)
w_divisor = divisor
w_power = 1
# 同じ割る数が連続したとき
elsif (divisor == w_divisor)
w_power += 1
# 割る数が変わったとき
elsif (divisor != w_divisor)
# 保存した割る数が1乗だったとき
if (w_power == 1)
out1_file.print(w_divisor," × ")
# 保存した割る数が2乗以上だったとき
else
out1_file.print(w_divisor,"^",w_power," × ")
end
w_power = 1
w_divisor = divisor
end
#
# 割り切れないとき
#
else
divisor += table[index]
if (index == 3)
index -= 1
else
index += 1
end
end
end
# 最後の割る数が何もない(素数)のとき
if (w_divisor == 0)
out1_file.print(number,"\n")
# 保存した割る数の乗数が1乗のとき
elsif (w_power == 1)
out1_file.print(w_divisor," × ",number,"\n")
# 最後の割る数と保存した割る数が同じ(同じ割る数がもう1乗増える)とき
elsif (w_divisor == number)
w_power += 1
out1_file.print(w_divisor,"^",w_power,"\n")
# 最後の割る数と保存した割る数が異なり、保存した割る数の乗数が2乗以上のとき
else
out1_file.print(w_divisor,"^",w_power," × ",number,"\n")
end
end
# ファイルのクローズ
in1_file.close
out1_file.close
スクリプトはこちらにあります(必ずshift_jisで保存してください)。
111111111111 82944 580608 8616460799 37
111111111111 = 3 × 7 × 11 × 13 × 37 × 101 × 9901 82944 = 2^10 × 3^4 580608 = 2^10 × 3^4 × 7 8616460799 = 89681 × 96079 37 = 37