10問目
10より小さい("below" って「以下」「未満」どっち?)素数の合計は, 2 + 3 + 5 + 7 = 17.
http://projecteuler.net/index.php?section=problems&id=10
2000000 より小さい全ての素数の合計を求めよ.
素数を正確に列挙する手段ってエレガントな方法は無く, ただひたすら約数で割ってみたり, エラトステネスの篩を使うしか無いんですよね…….
なので, このプログラムもあまり面白いとこは無かったです.
#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; }