Cygwinでデバッグ/例題2

三角数の和への分解

三角数の説明

同じ三角数を何度も使って分解してよい。

この定理はガウスによって証明された。

作りたいプログラム

自然数のうちで、三角数の和に分解したときに、なるべく分解の種類の多いものを求めたい。 以下の指示に従って、順にプログラムを作れ。



2つの三角数の和に分解することは、まだ考えなくてよい。(つまり、分解に失敗する例があっても構わない。)

ヒント

 for (....) {
     for (....) {
         for (....) {
             sum = tri(i) + tri(j) + tri(k);
             if (sum == p) {


ヒント1:「3つ以下」の部分を、「ちょうど3つ、ただし0が混じってもよい」と解釈すると、プログラムが簡単になる。「tri(0) = 0」 なので都合がよい。

例: 6 = 0 + 0 + 6
   6 = 0 + 3 + 3

ヒント2:重複する分解は、うまくループを回すことで、候補から除外できる。

例: 10 = 1 + 3 + 6 で1通りと数えるとすると、
   10 = 1 + 6 + 3 や、
   10 = 3 + 1 + 6 などは、探索しないように工夫すればよい。


num_of_sum_of_tri() 関数が、画面表示をしていると、時間がかかりすぎる。画面表示をやめれば、数秒で結果が出るようになるはずである。


num_of_sum_of_tri() 関数での探索に、無駄がないか検討せよ。

なお、コンパイル時にオプションをつけると、同じプログラムのままでも実行速度が早くなる。

gcc -O2 hoge.c

のように、"-O2"(マイナス・オー・に)を付け加えるとよい。


実行時間を測るには、

./a.exe

を実行する代わりに、

time ./a.exe

と、先頭に "time" を付けて実行すればよい。0.01 秒よりも細かい値が表示されるかもしれないが、かなりの誤差も含んでいる。信頼のおける値は 0.03 秒単位ぐらいである。

解答の一部

(注意)* は伏字である。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS