project euler 6~10

6.1から100の和を2乗したものと1から100までの値各々を2乗した値をすべて足した値との差を出す

int main(void){
    int a=0,b=0;
    for(int i=1;i<101;i++){
        a += i*i;
        b += i;
    }
    cout << b*b-a<<endl;
   return 0;
}

7.素数の10001番目を出す。エラトステネスの篩を使いました

#define smax 400000
int a[smax];
vector<int> num;

void furui(){
    fill(a,a+smax,1);
    a[0] = a[1] = 0;
    REP(i,2,smax){
        if(a[i]){
            for(int j=i*2;j<smax;j+=i) a[j] = 0;
        }
    }
    rep(i,smax) if(a[i]) num.push_back(i);
}

int main(void){
    furui();
    cout << num[10000] << endl;
    return 0;
}

8.与えられた1000桁の数字の連続する5つの数字の積の最大を求める
これはinputfileを使っています。

string str;
int main(void){
    cin >> str;
    int res=0;
    for(int i=0;i<1000-4;i++){
        int s = 1;
        for(int j=i;j<i+5;j++){
            s *= str[j]-'0';
        }
        res = max(res,s);
    }
    cout << res << endl;
   return 0;
}

9.ピタゴラスの定理が成り立つ3つの値の和が1000になる組みが1組存在するのでその3つの値の積をだす
愚直にやりましたが0 < a < (n/3),a < b < (n/2)が成立するため少しfor文はいじりました。

int main(void){
    for(int i=1;i<1000/3;i++)
        for(int j=i+1;j<1000/2;j++)
            for(int k=j+1;k<1000;k++)
                if(k*k == i*i+j*j && i+j+k == 1000){
                    cout <<i*j*k <<endl;
                    break;
                }
   return 0;
}

10.200万以下の素数の和を求める

#define smax 2000001

int a[smax];

void furui(){
    fill(a,a+smax,1);
    a[0] = a[1] = 0;
    for(int i=2;i<smax;i++){
        if(a[i]){
            for(int j=i*2;j<smax;j+=i) a[j] = 0;
        }
    }
}
    
int main(void){
    furui();
    ll sum=0;
    REP(i,2,smax)
        if(a[i]) sum += i;
    cout << sum << endl;
   return 0;
}