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

Problem6 最初の100個の自然数の、和の2乗と2乗の和の差

最初の10個の自然数について、その和の2乗と、2乗数の和は以下の通り。

1*1 + 2*2 + ... + 10*10 = 385
(1 + 2 + ... + 10)の2乗 = 3025
これらの数の差は 3025-385=2640となる。

同様にして、最初の100個の自然数について和の2乗と2乗の和の差を求めよ。


SQL

--■■■PL/SQLを使う方法■■■
declare
    SumVal1 pls_Integer :=0;
    SumVal2 pls_Integer :=0;
begin
    for I in 1..100 Loop
        SumVal1 := SumVal1 + I*I;
        SumVal2 := SumVal2 + I;
    end Loop;
    DBMS_Output.Put_Line('Answer=' ||
                          to_char(abs(SumVal1-SumVal2*SumVal2)));
end;
/

--■■■model句を使う方法(10g以降)■■■
with tmp as(
select soeji as Val
  from dual
 model
dimension by(1 as soeji)
measures(0 as dummy)
rules(dummy[for soeji from 1 to 100 increment 1]= 0))
select abs(sum(Val*Val)-sum(Val)*sum(Val)) as Answer
  from tmp;

--■■■再帰with句を使う方法(11gR2以降)■■■
with rec(Val) as(
select 1 from dual
union all
select Val+1
  from rec
 where Val+1 <= 100)
select abs(sum(Val*Val)-sum(Val)*sum(Val)) as Answer
  from rec;


実行結果

  Answer
--------
25164150


解説

PL/SQLを使わずに、model句や再帰with句を使うのもいいと思います。
model句を使う場合は、インラインビューが必須となります。(model句はhaving句の後で評価されるため)

C#での解