さえめろ の めも🐰

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

プロジェクトオイラー #16~#17

第4弾。

#16「各位の数字の和」
215 = 32768 であり, 各位の数字の和は 3 + 2 + 7 + 6 + 8 = 26 となる.
同様にして, 21000 の各位の数字の和を求めよ.
注: Problem 20 も各位の数字の和に関する問題です。解いていない方は解いてみてください。

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

var ary = [1];  // 桁を入れる配列
var total = 0;

for(var i = 0; i < 1000; i++){
    var x = 0;  // 繰り上がりを登録する変数
    
    for(var j = 0; j <= 1000; j++){
        if(ary[j]){
            var digit = ary[j];
        }else{
            var digit = 0;
        }
        // 2乗の処理
        digit = 2 * digit + x;
        // 繰り上がりの処理
        if(digit > 9){
            digit -= 10;
            x = 1;
        }else{
            x = 0;
        }
        
        ary[j] = digit;
    }
}
// 桁を足す
for(var k in ary){
    total += ary[k];
}
console.log(total);

JSでは巨大数の扱いに限界があることを改めて知った。
pythonだとそのまま計算できるみたいですが、一桁ずつ配列に入れ繰り上がりの処理をするという面倒臭い結果に。解答:1366(反転)



#17「数字の文字数」
1 から 5 までの数字を英単語で書けば one, two, three, four, five であり, 全部で 3 + 3 + 5 + 4 + 4 = 19 の文字が使われている.
では 1 から 1000 (one thousand) までの数字をすべて英単語で書けば, 全部で何文字になるか.
注: 空白文字やハイフンを数えないこと. 例えば, 342 (three hundred and forty-two) は 23 文字, 115 (one hundred and fifteen) は20文字と数える. なお, "and" を使用するのは英国の慣習.

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

// 各位の文字数
var x = [0, 3, 3, 5, 4, 4, 3, 5, 5, 4];
var y = [3, 6, 6, 8, 8, 7, 7, 9, 8, 8];
var z = [6, 6, 5, 5, 5, 7, 6, 6];

var total = 0;
var num = 0;

// 一桁
for (var i in x) {
    total += x[i];
}
// 10代
for (var i in y) {
    total += y[i];
}

// 二桁
for (var i in z) {
    for (var j in x) {
        total = total + z[i] + x[j];
    }
}

num = total;

// 三桁(100~900まで100個ずつを9回ループにして考える)
for(var i = 1; i < 10; i++){
    total += num;
    var m = x[i] + 7;    // xx hundredを足す
    total += m;
    total += 99 * (m + 3); // xx hundred andを足す
}

total += 11; // one thousandを足す

console.log(total);

死んだ可読性。最初の配列を、one,two,three...といれていって.lengthでとればもう少しわかりやすかったかな〜と今更思う。
こうやって頭でなんとなく考えられる問題だと楽なんだけどな。1000乗とかしないで。解答:21124(反転)



#20「各位の数字の和 2」
n × (n - 1) × ... × 3 × 2 × 1 を n! と表す.

例えば, 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 となる.
この数の各桁の合計は 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 である.

では, 100! の各位の数字の和を求めよ.

注: Problem 16 も各位の数字の和に関する問題です。解いていない方は解いてみてください。

x = 1
for i in range(1,100):
    x *= i
s = str(x)
total = 0
for i in s[:]:
    total += int(i)
    
print(total)