三角数の数列は自然数の和で表わされ、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#での解