Files
freeCodeCamp/curriculum/challenges/japanese/10-coding-interview-prep/project-euler/problem-56-powerful-digit-sum.md
2022-01-20 20:30:18 +01:00

102 lines
2.1 KiB
Markdown

---
id: 5900f3a41000cf542c50feb7
title: '問題 56: 累乗の各位の和'
challengeType: 5
forumTopicId: 302167
dashedName: 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)` は数値を返す必要があります。
```js
assert(typeof powerfulDigitSum(3) === 'number');
```
`powerfulDigitSum(3)``4` を返す必要があります。
```js
assert.strictEqual(powerfulDigitSum(3), 4);
```
`powerfulDigitSum(10)``45` を返す必要があります。
```js
assert.strictEqual(powerfulDigitSum(10), 45);
```
`powerfulDigitSum(50)``406` を返す必要があります。
```js
assert.strictEqual(powerfulDigitSum(50), 406);
```
`powerfulDigitSum(75)``684` を返す必要があります。
```js
assert.strictEqual(powerfulDigitSum(75), 684);
```
`powerfulDigitSum(100)``972` を返す必要があります。
```js
assert.strictEqual(powerfulDigitSum(100), 972);
```
# --seed--
## --seed-contents--
```js
function powerfulDigitSum(n) {
return true;
}
powerfulDigitSum(3);
```
# --solutions--
```js
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;
}
```