1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105,...
n * (n+1) / 2
例: 10 = 1 + 3 + 6
この定理はオイラーによって証明された。
例:12 = 1 + 1 + 10 12 = 3 + 3 + 6
以下の指示に従って、プログラムを作れ。
int tri(int n)を作りなさい。そして、自然数 a が与えられたときに、3つの三角数の和に分解して、その値を表示する関数
void sum_of_tri(int a)を作りなさい。分解の仕方は、自由にしてよい。
int num_of_sum_of_tri(int a)を作りなさい。
ヒント1:「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() 関数が、画面表示をしていると、時間がかかりすぎる。画面表示をやめれば、数秒で結果が出るようになるはずである。
コンパイル時にオプションをつけると、同じプログラムのままでも実行速度が早くなる。
gcc -O2 hoge.cのように、"-O2"(マイナス・オー・に)を付け加えるとよい。
実行時間を測るには、
./a.exeを実行する代わりに、
time ./a.exeと、先頭に "time" を付けて実行すればよい。0.01 秒よりも細かい値が表示されるかもしれないが、かなりの誤差も含んでいる。実用上あてにできる値は 0.03 秒単位ぐらいである。