102 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| }
 | |
| ```
 |