マツケンのマインド

とある理系大学生のブログです。基本は勉強とつぶやきとまとめです。

プロジェクトオイラー 問題10(project euler problem 10)

課題やっと片付いた!専攻がむずくなってきましたが、量子情報の研究室行くためにGPAしっかり維持せねば...
あっ、どうも、マツケンです。

今回の問題↓
Problem 10 - PukiWiki

<考え方>
・最近習得したアリストテレスの篩を行っていく。
・大きい配列を扱える最強のmalloc実装!
・探索範囲の削減。(詳しくはソースコード参照)<ソースコード>

/*
    The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

    Find the sum of all the primes below two million.
*/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define N 2000000

int main(void){
    
    int sq_num = (int)sqrt((double)N);
    long long int sum = 0;
    int *prime;  //素数であるものに1を、そうでないものに0を対応させる配列。
    prime = (int *) malloc(sizeof(int) * N);
    clock_t start, end;

    start = clock();

    for (int i = 0; i < N; i++)
        prime[i] = 1;  //素数の候補を作るために、全ての数に1を入れる。
        prime[0] = 0;//0は素数ではない。    
        prime[1] = 0;//1は素数じゃない。

    for (int i = 2; i <= sq_num; i++) {//探索範囲の削減
        if (prime[i] == 1)          //注目している数、prime[i]が素数なら
        for (int j = i; i * j <= N; j++)//j ≧ i
            prime[i * j] = 0;  //素数の倍数は素数じゃない。
    }

    for(int i = 0; i < N; i++){
        if(prime[i] == 1) sum += i;
    }

    printf("Ans = %lld\n", sum);

    end = clock();
    printf("かかった時間%d[ms]\n", end - start);

    free(prime);
    return (0);
}

<実行結果>

Ans = 142913828922
かかった時間149[ms]

今回は見やすいかな...?