project euler 1~5

1. 3の倍数と5の倍数をたす(1000未満)

int main(void){
    int sum(0);
    REP(i,1,1000)
        if(i % 3 == 0 || i % 5 == 0) sum+=i;
    cout << sum << endl;
   return 0;
}

2. フィボナッチ数列で偶数の値のものをたす(4000000以下まで)

#define smax 10000000

int dp[smax];

int main(void){
    dp[0] = 1;
    dp[1] = 2;
    int sum=0;
    REP(i,2,smax){
        dp[i] = dp[i-1]+dp[i-2];
        if(dp[i] >= 4000000) break;
        if(dp[i] %2 == 0 ) sum += dp[i];
    }
    cout << sum+2 << endl;
   return 0;
}

3.素因数のなかで一番大きいものを出力する

int main(void){
    map<ll,ll,greater<ll> > ma;
    ll num = 600851475143;
    int i=2;
    for(;;){
        if(num == 1) break;
        if(num % i == 0){
            num /= i;
            ma[i]++;
        }
        else i++;
    }
    map<ll,ll>::iterator it = ma.begin();
    cout << it->first << endl;
   return 0;
}

4.3桁の2つの数の積で回文であるもののなかの最大の値をだす。
わざわざvectorに保存する必要がなかったと思ったw

#include<boost/lexical_cast.hpp>

int solve(string str){
    int cnt=0;
    bool flag = false;
    rep(i,str.size()/2){
        if(str[i] == str[str.size()-i-1]) cnt++;
        else{
            flag = true;
            break;
        }
    }
    if(flag) return 0;
    else return 1;
}

int main(void){
    ll s;
    string str;
    vector<int> ve;
    for(int i=999;i>99;i--){
        for(int j=i;j>99;j--){
            s = i*j;
            if(1 == solve(str = boost::lexical_cast<string>(s))){
                ve.push_back(atoi(str.data()));
            }
        }
    }
    sort(ALL(ve),greater<int>());
    cout << ve[0] << endl;
    return 0;
}

5.1から20までの値全てで割れる値の最小値をだす

int solve(int a){
    for(int i=20;i>0;i--){
        if(a%i == 0) continue;
        else return 0;
    }
    return 1;
}

int main(void){
    for(int i=20;;i++){
        if(1 == solve(i)){
            cout << i << endl;
            break; 
        }
    }
    return 0;
}