問題1

問題文
10未満の自然数のうち3または5の倍数を並べると, 「3, 5, 6, 9」となる.
そして, それらの合計は23.

では, 1000未満の全ての3または5の倍数の合計は?

http://projecteuler.net/index.php?section=problems&id=1

まずは, 安直に解く.
今後, 解法のバージョンを切り替えて実行できるように, main 関数を作ってある.

#include <stdio.h>
#include <stdlib.h>

int solveVer00(int num1, int num2, int ceiling) {
	int i;
	int sum;

	for (i = 1, sum = 0; i < ceiling; i++) {
		if (i % num1 == 0
			|| i % num2 == 0) {
			sum += i;
		}
	}
	return sum;
}

int main(int argc, char **argv) {
	int version;

	if (argc == 1) {
		version = 0;
	} else {
		version = atoi(argv[1]);
	}

	switch (version) {
	case 0:
		printf("Solution: %d\n", solveVer00(3, 5, 1000));
		break;
	default:
		break;
	}

	return 0;
}

問題文から自然数は0を含まないとなってるみたいなので, for ループは1から始めてみました。まぁ, 0を含めても答えは変わらない訳ではありますが.

改良の方向としては,

  1. 「1から999までのmの倍数の合計」を計算する関数を作って, (3の倍数の合計)+(5の倍数の合計)-(15の倍数の合計) を計算.

くらいかな?

拡張の方向としては,

  1. mからnまでのp_1またはp_2または...またはp_nの倍数の合計を計算する関数を書く.
  2. Haskell で解く. (Haskell の記法は数学に近いので, ソースは綺麗になりそう. )
  3. これを機会に新しい言語に手を出す.

などなどでしょうか?

さて, 今後の衝動をお楽しみに.