さえめろ の めも🐰

さえめろの備忘録です。twitter : @sae_mero_

プロジェクトオイラー #6~#10

第二弾。




#6「二乗和の差」
最初の10個の自然数について, その二乗の和は,
12 + 22 + ... + 102 = 385
最初の10個の自然数について, その和の二乗は,
(1 + 2 + ... + 10)2 = 3025
これらの数の差は 3025 - 385 = 2640 となる.
同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.

process.stdin.resume();
process.stdin.setEncoding('utf8');

// 和
var a = 0;
for(var i = 100; i>0; i--){
    a = a + i;
}

// 二乗の和
var b = 0;
for(var i = 100; i>0; i--){
    var n = i;
    n = n*n;
    b += n;
}

// 和の二乗 - 二乗の和
var total = a*a - b;
console.log(total);

素直に計算し差を出した。解答:25164150(反転)



#7「10001番目の素数
素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
10 001 番目の素数を求めよ.

process.stdin.resume();
process.stdin.setEncoding('utf8');

var sosuu = [2,3]; 
var n = 5;

function aaa(x){
    
    function hantei(n){
        var l = Math.ceil(Math.sqrt(n));
        var i = 1
        var p = sosuu[i];
        while(p <= l){
            if(n % p === 0){
                return false;
            }
            i++;
            p = sosuu[i];
        }
        return true;
    }
    
    for(i = 2; i <= x; i++){
        while(hantei(n) === false){
            n += 2;
        }
        sosuu.push(n);
        n += 2;
    }
    return sosuu[x - 1];
}

console.log(aaa(10001));

素数だらけですね。でもこれでx番目の素数が楽に求まる~。解答:104743(反転)



#8「数字列中の最大の積」
次の1000桁の数字のうち, 隣接する4つの数字の総乗の中で, 最大となる値は, 9 × 9 × 8 × 9 = 5832である.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

この1000桁の数字から13個の連続する数字を取り出して, それらの総乗を計算する. では、それら総乗のうち、最大となる値はいくらか.
EX 6桁の数123789から5個の連続する数字を取り出す場合, 1*2*3*7*8と2*3*7*8*9の二通りとなり, 後者の2*3*7*8*9=3024が最大の総乗となる.

process.stdin.resume();
process.stdin.setEncoding('utf8');

var text = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
// 1桁ずつ配列の要素にする
var ary = text.split("");
var max = 0;
// ary[0]から順に自身から数えて13個の要素をかける
for(var i in ary){
    var x = 1;
    for(var j = 0; j < 13; j++){
        var n = new Number(i) + new Number(j);
        x = x * ary[n];
    }
    if(x > max){
        max = x;
    }
}
console.log(max);

これも楽な部類。配列操作なので、数列が大きくなったりするときついのかもしれない。解答:40824(反転)



#9「特別なピタゴラス数」
ピタゴラス数(ピタゴラスの定理を満たす自然数)とは a < b < c で以下の式を満たす数の組である.
a2 + b2 = c2
例えば, 32 + 42 = 9 + 16 = 25 = 52 である.
a + b + c = 1000 となるピタゴラスの三つ組が一つだけ存在する.
これらの積 abc を計算しなさい.

process.stdin.resume();
process.stdin.setEncoding('utf8');

for(var a = 0; a < 1000; a++){
    for(var b = a + 1; b< 1000; b++){
        var c = 1000 - (a + b);
        if(b < c){
            if(a*a + b*b === c*c){
                console.log(a*b*c);
            }
        }
    }
}

そのまま。ピタゴラスの定理についてもう少し理解が必要かなあと感じた。
f:id:saemero:20170424181536p:plain
ひえ~!すぐわすれる~!解答:31875000(反転)



#10「素数の和」
10以下の素数の和は 2 + 3 + 5 + 7 = 17 である.
200万以下の全ての素数の和を求めよ.

process.stdin.resume();
process.stdin.setEncoding('utf8');

function sosuu (x){
    
    var ary1 = [];
    var ary2 = [];
    
    for(var i = 2; i <= x; i++){
        ary1.push(i);
    }
    
    var sqrt = Math.sqrt(x); // 平方根
    
    while(ary1[0] <= sqrt){
        var n = ary1.shift();
        ary2.push(n);
        ary1 = ary1.filter(function(num){
            return num % n != 0
        });
    }
    
    return ary2.concat(ary1);
}
var ary3 = sosuu(2000000);

JSだと処理が半端ないようで、どう頑張っても時間切れ。今の知識ではここが精いっぱいなのかもしれない…。
素数判定のためにエラトステネスの篩を使うことを覚えた。解答:142913828922(反転)(頑張って処理できればたぶんあってる)