トップページに戻る    前のProblemへ

Problem12 501個以上の約数をもつ最初の三角数

三角数の数列は自然数の和で表わされ、7番目の三角数は1+2+3+4+5+6+7 = 28 である。
三角数の最初の10項は
1,3,6,10,15,21,28,36,45,55, ... となる。

最初の7項について、その約数を列挙すると、以下のとおり。

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

これから、7番目の三角数である28は、6個以上の約数をもつ最初の三角数であることが分る。
では、501個以上の約数をもつ最初の三角数はいくらか。


SQL

declare
    SankakuSuu pls_Integer := 0;
    YakusuuCnt pls_Integer;
    LoopI pls_Integer := 1;

    --約数の数を求めるファンクション
    function getYakusuuCnt(pVal pls_Integer) return pls_Integer Is
        CopiedVal pls_Integer  := pVal;
        WillProd pls_Integer;
        YakusuuCnt pls_Integer := 1;
    begin
        for I in 2..pVal Loop
            if mod(CopiedVal,I) = 0 then
                WillProd := 1;
                Loop
                    WillProd := WillProd + 1;
                    CopiedVal := CopiedVal / I;
                    exit when mod(CopiedVal,I) != 0;
                end Loop;
                YakusuuCnt := YakusuuCnt * WillProd;
            end if;
        end Loop;
        return YakusuuCnt;
    end;
begin
    Loop
        SankakuSuu := SankakuSuu + LoopI;
        YakusuuCnt := getYakusuuCnt(SankakuSuu);
        if YakusuuCnt >= 501 then
            DBMS_Output.Put_Line(to_char(SankakuSuu) || 'の約数は' || to_char(YakusuuCnt) || '個');
            exit;
        end if;
        LoopI := LoopI + 1;
    end Loop;
end;
/


実行結果

30秒で終了するC#と比べて、40分でも終わらないので改善が必要・・・


解説

C#での解