素因数分解を行うスクリプトです。上限は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