次の問題です。
区切りの中の数を実際に順番に加えていって調べるのはちょっと面倒です。何かいい解答方法があるのでしょう。でもパソコンならば面倒なことでもいとも簡単に計算します。
プログラムは次のようになりました。1個,2個,3個の繰り返しは剰余算でシンプルにコーディングできます。また, ここでは break なしの switch 文を書いてみました。
/* MSC 5.1 */
#include <stdio.h>
/*
* 100番目の区切りの数
*/
void q100(void)
{
int i; /* 1 からの整数 */
int n; /* n 番目 */
/* 1番目から100番目まで順次計算 (0 から 99 とする) */
for(i = 0, n = 0; n < 100; n++){
switch(n % 3){ /* 3個の繰り返しを剰余で計算 */
case 2: /* 3個目 */
i++;
/* not break */
case 1: /* 2個目 */
i++;
/* not break */
case 0: /* 1個目 */
i++;
}
}
printf("100 番目の区切りは %d と %d の間です.\n", i, i+1);
}
/*
* 区切りの中の数の和が305となる区切り番号
*/
void q305(void)
{
int i; /* 1 からの整数 */
int n; /* n 番目 */
int add; /* 区切りの中の和 */
/*
* 1番目から区切りの中の数の和が305となる
* 区切りまで順次計算
*/
for(i = 0, n = 0; ; n++){
add = 0; /* 区切りの中の和をクリア */
switch(n % 3){ /* 3個の繰り返しを剰余で計算 */
case 2: /* 3個目 */
i++;
add += i;
/* not break */
case 1: /* 2個目 */
i++;
add += i;
/* not break */
case 0: /* 1個目 */
i++;
add += i;
}
if(add == 305)
break;
}
printf("区切りの中の数の和が 305 となるのは %d 番目です.\n", n + 1);
}
main()
{
q100();
q305();
}