■Windows版Rubyの細道・けもの道

■ナビゲータ

[南北館(最初のメニュー)]

  1. [Windows版Rubyの細道・けもの道]
    1. [1.準備編]
    2. [2.基本編]
    3. [3.応用編]
      1. [3-1.固定長データとCSVデータとの変換]
      2. [3-2.重複データの処理]
      3. [3-3.フォルダ内の一括処理]
      4. [3-4.1つのファイルを複数のファイルに分割する]
      5. [3-5.文字コードの変換]
      6. [3-6.半角全角変換]
      7. [3-7.多次元配列の処理]
      8. [3-9.その他]
        1. [3-9-1.文字列のフォーマットを変更する]
        2. [3-9-2.メッセージを表示する]
        3. [3-9-3.ファイルのサイズを取得する]
        4. [3-9-4.当日・前日・前営業日、前月末日・当月末日・翌月末日を取得する]
        5. [3-9-5.複数レコードを1レコードにまとめる]
        6. [3-9-6.電卓プログラム]
        7. [3-9-7.素因数分解]
    4. [スクリプトと入力データのサンプル]
Perlではどう処理する?
同じことをPerlではこうしています。

3.応用編

3-9.その他

3-9-7.素因数分解

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



Copyright (c) 2004-2013 Mitsuo Minagawa, All rights reserved.