問題1

http://d.hatena.ne.jp/cocoatomo/20090329/1238295371 の続きです。ちょこっとだけ改良を加えました。

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

int solveVer00(int, int, int);
int solveVer01(int, int, int);
int sumOfMultiples(int, int);

/**
 * 0 以上 ceiling 未満の num1, num2 の倍数の合計を求める関数. 
 */
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;
}

/**
 * 0 以上 ceiling 未満の num の倍数の合計を求める関数. 
 */
int sumOfMultiples(int num, int ceiling) {
	int numOfNum;
	numOfNum = (ceiling - 1) / num;
	return numOfNum * (numOfNum + 1) * num / 2;
}

int solveVer01(int num1, int num2, int ceiling) {
	return sumOfMultiples(num1, ceiling)
		+ sumOfMultiples(num2, ceiling)
		- sumOfMultiples(num1 * num2, ceiling);
}

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;
	case 1:
		printf("Solution: %d\n", solveVer01(3, 5, 1000));
		break;
	default:
		break;
	}

	return 0;
}