2.1 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			2.1 KiB
		
	
	
	
	
	
	
	
id, title, challengeType, forumTopicId, dashedName
| id | title | challengeType | forumTopicId | dashedName | 
|---|---|---|---|---|
| 5900f3a41000cf542c50feb7 | 問題 56: 累乗の各位の和 | 5 | 302167 | problem-56-powerful-digit-sum | 
--description--
グーゴル (10^{100}) は 1 の後に 0 が 100 個も続く巨大な数で、$100^{100}$は 1 の後に 0 が 200 個続く、想像を絶する大きさの数です。 その大きさにもかかわらず、どちらの数も各位の和はわずか 1 です。
a, b < n のとき、自然数 a^b の最大の各位の和を求めなさい。
--hints--
powerfulDigitSum(3) は数値を返す必要があります。
assert(typeof powerfulDigitSum(3) === 'number');
powerfulDigitSum(3) は 4 を返す必要があります。
assert.strictEqual(powerfulDigitSum(3), 4);
powerfulDigitSum(10) は 45 を返す必要があります。
assert.strictEqual(powerfulDigitSum(10), 45);
powerfulDigitSum(50) は 406 を返す必要があります。
assert.strictEqual(powerfulDigitSum(50), 406);
powerfulDigitSum(75) は 684 を返す必要があります。
assert.strictEqual(powerfulDigitSum(75), 684);
powerfulDigitSum(100) は 972 を返す必要があります。
assert.strictEqual(powerfulDigitSum(100), 972);
--seed--
--seed-contents--
function powerfulDigitSum(n) {
  return true;
}
powerfulDigitSum(3);
--solutions--
function powerfulDigitSum(n) {
  function sumDigitsOfPower(numA, numB) {
    let digitsSum = 0;
    let number = power(numA, numB);
    while (number > 0n) {
      const digit = number % 10n;
      digitsSum += parseInt(digit, 10);
      number = number / 10n;
    }
    return digitsSum;
  }
  function power(numA, numB) {
    let sum = 1n;
    for (let b = 0; b < numB; b++) {
      sum = sum * BigInt(numA);
    }
    return sum;
  }
  const limit = n - 1;
  let maxDigitsSum = 0;
  for (let a = limit; a > 0; a--) {
    for (let b = limit; b > 0; b--) {
      const curDigitSum = sumDigitsOfPower(a, b);
      if (curDigitSum > maxDigitsSum) {
        maxDigitsSum = curDigitSum;
      }
    }
  }
  return maxDigitsSum;
}