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

gcc -O2 hoge.c

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


Cygwin 環境で実行時間を測るには、

./a.exe

を実行する代わりに、

time ./a.exe

と、先頭に "time" を付けて実行すればよい。出力例は以下のようになる。

real	0m0.020s
user	0m0.008s
sys	0m0.004s

real の欄はバックグラウンドで動くプログラムの影響を受けて長くなることがあるので、user の欄の値で判断すればよい。どの数値も 0.01 秒よりも細かい値が表示されるが、かなりの誤差も含んでいる。信頼のおける値は 0.03 秒単位ぐらいである。

解答の一部

(注意)? は伏字である。実際には数字1桁(0から9のどれか)である。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-18 (火) 08:49:50