10問目

10より小さい("below" って「以下」「未満」どっち?)素数の合計は, 2 + 3 + 5 + 7 = 17.
2000000 より小さい全ての素数の合計を求めよ.

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

素数を正確に列挙する手段ってエレガントな方法は無く, ただひたすら約数で割ってみたり, エラトステネスの篩を使うしか無いんですよね…….
なので, このプログラムもあまり面白いとこは無かったです.

#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <ctype.h>
#include "prime.h"

#define DEFAULT_NUMBER 2000000

int version;
long number;

int parseArg(int, char**);
long long solveVer00(long);

int main(int argc, char **argv) {
	if (parseArg(argc, argv) == EXIT_FAILURE) {
		return EXIT_FAILURE;
	}
	switch (version) {
	case 0:
		fprintf(stdout, "Solution: %lld.\n", solveVer00(number));
		break;
	default:
		break;
	}
	return EXIT_SUCCESS;
}

long long solveVer00(long number) {
	long long result;
	long p;

	result = 0;
	prime(number);
	while ((p = prime(0)) != -1) {
#if DEBUG
		fprintf(stdout, "p: %ld\n", p);
#endif
		result += p;
	}
	return result;
}

int parseArg(int argc, char **argv) {
	int optChar;

	// default values
	version = 0;
	while ((optChar = getopt(argc, argv, "v:")) != -1) {
		switch (optChar) {
		case 'v':
			version = atoi(optarg);
			break;
		case '?':
			if (optopt == 'c') {
				fprintf(stderr, "Option -%c requires an argument.\n", optopt);
			} else if (isprint(optopt)) {
				fprintf(stderr, "Unknown option `-%c'.\n", optopt);
			} else {
				fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt);
			}
			return EXIT_FAILURE;
		default:
			abort();
		}
	}
	if (optind == argc) {
		number = DEFAULT_NUMBER;
	} else {
		number = atol(argv[optind]);
	}	
	return EXIT_SUCCESS;
}