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

■ナビゲータ

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

  1. [Windows版Perlの細道・けもの道]
    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. [スクリプトと入力データのサンプル]
rubyではどう処理する?
同じことをrubyではこうしています。

3-9.その他

3-9-7.素因数分解

素因数分解を行うスクリプトです。上限は5000兆くらいです。

【スクリプト】
# factorize.pl
# 内容 : 素因数分解のプログラム
# Copyright (c) 2002-2011 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>perl factorize.pl
#   
open(IN1,"in1.txt");    
open(OUT1,">out1.txt");        

#   
#定数の設定 
#   
@table    =    (1,2,2,4);    
while    ($number    =    <IN1>)    {    
    $w_divisor  =    0;    # 割る数の保存した値
    $w_power    =    0;    # 保存した割る数が何乗なのかを示す値
    chomp($number);    
    print    OUT1    "$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++;
            }    
# 割る数が変わったとき
            elsif   ($divisor   !=    $w_divisor)   {
# 保存した割る数が1乗だったとき
                if  ($w_power   ==    1)            {
                    print    OUT1    "$w_divisor × ";    
                }    
# 保存した割る数が2乗以上だったとき
                else                                {
                    print    OUT1    "$w_divisor^$w_power × ";    
                }    
                $w_power    =    1;
                $w_divisor  =    $divisor;
            }    
        }    
#   
#割り切れないとき   
#   
        else                                        {    
                $divisor    +=    $table[$index];    
            if  ($index     ==    3)                {    
                $index--;    
            }    
            else                                    {    
                $index++;    
            }    
        }    
    }    
# 保存した割る数が何もない(素数)のとき
    if      ($w_divisor    ==    0)                 {
            print    OUT1    "$number\n";    
    }    
# 保存した割る数の乗数が1乗のとき
    elsif   ($w_power    ==    1)                   {
            print    OUT1    "$w_divisor × $number\n";    
    }
# 最後の割る数と保存した割る数が同じ(同じ割る数がもう1乗増える)とき
    elsif   ($w_divisor    ==    $number)           {
            $w_power++;
            print    OUT1    "$w_divisor^$w_power\n";    
    }    
# 最後の割る数と保存した割る数が異なり、保存した割る数の乗数が2乗以上とき
    else                                            {
            print    OUT1    "$w_divisor^$w_power × $number\n";    
    }    
}    
close(IN1);
close(OUT1);
    
【スクリプトとデータのサンプル】

スクリプトはこちらにあります。

【入力データ】
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.