三角数の数列は自然数の和で表わされ、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個以上の約数をもつ最初の三角数はいくらか。
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#での解