2018-10-10 22:03:03 +00:00
|
|
|
|
---
|
|
|
|
|
id: 5900f3831000cf542c50fe96
|
2020-12-16 07:37:30 +00:00
|
|
|
|
title: 问题23:非丰富的总和
|
2018-10-10 22:03:03 +00:00
|
|
|
|
challengeType: 5
|
|
|
|
|
videoUrl: ''
|
2021-01-13 02:31:00 +00:00
|
|
|
|
dashedName: problem-23-non-abundant-sums
|
2018-10-10 22:03:03 +00:00
|
|
|
|
---
|
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
# --description--
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
完美数字是一个数字,其正确除数的总和恰好等于数字。例如,28的适当除数之和为1 + 2 + 4 + 7 + 14 = 28,这意味着28是一个完美数。如果`n`的适当除数之和小于`n` ,则`n`被称为不足,如果该和超过`n`则称为`n` 。由于12是最小的有限数,1 + 2 + 3 + 4 + 6 = 16,可以写成两个有限数之和的最小数是24.通过数学分析,可以看出所有整数都大于28123可以写成两个数字的总和。然而,即使已知不能表示为两个充裕数的总和的最大数小于该限制,也不能通过分析进一步减小该上限。找出所有正整数<= `n`的总和,它不能写成两个丰富数字的总和。
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
# --hints--
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
`sumOfNonAbundantNumbers(10000)`应返回3731004。
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
```js
|
|
|
|
|
assert(sumOfNonAbundantNumbers(10000) === 3731004);
|
2018-10-10 22:03:03 +00:00
|
|
|
|
```
|
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
`sumOfNonAbundantNumbers(15000)`应该返回4039939。
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
|
|
|
|
```js
|
2020-12-16 07:37:30 +00:00
|
|
|
|
assert(sumOfNonAbundantNumbers(15000) === 4039939);
|
2018-10-10 22:03:03 +00:00
|
|
|
|
```
|
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
`sumOfNonAbundantNumbers(20000)`应返回4159710。
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
```js
|
|
|
|
|
assert(sumOfNonAbundantNumbers(20000) === 4159710);
|
|
|
|
|
```
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
`sumOfNonAbundantNumbers(28123)`应该返回4179871。
|
2018-10-10 22:03:03 +00:00
|
|
|
|
|
|
|
|
|
```js
|
2020-12-16 07:37:30 +00:00
|
|
|
|
assert(sumOfNonAbundantNumbers(28123) === 4179871);
|
2018-10-10 22:03:03 +00:00
|
|
|
|
```
|
2020-08-13 15:24:35 +00:00
|
|
|
|
|
2021-01-13 02:31:00 +00:00
|
|
|
|
# --seed--
|
|
|
|
|
|
|
|
|
|
## --seed-contents--
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
function sumOfNonAbundantNumbers(n) {
|
|
|
|
|
|
|
|
|
|
return n;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sumOfNonAbundantNumbers(28123);
|
|
|
|
|
```
|
|
|
|
|
|
2020-12-16 07:37:30 +00:00
|
|
|
|
# --solutions--
|
|
|
|
|
|
2021-01-13 02:31:00 +00:00
|
|
|
|
```js
|
|
|
|
|
function abundantCheck(number) {
|
|
|
|
|
let sum = 1;
|
|
|
|
|
|
|
|
|
|
for (let i = 2; i <= Math.sqrt(number); i += 1) {
|
|
|
|
|
if(number % i === 0) {
|
|
|
|
|
sum += i + +(i !== Math.sqrt(number) && number / i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return sum > number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function sumOfNonAbundantNumbers(n) {
|
|
|
|
|
let sum = 0;
|
|
|
|
|
const memo = {};
|
|
|
|
|
let abundantList = [];
|
|
|
|
|
|
|
|
|
|
// Function checkSum checks if num can be represented as a sum of numbers in the stack (array)
|
|
|
|
|
const checkSum = (num, stack, memo) => {
|
|
|
|
|
for (let i = 0; i < stack.length; i += 1) {
|
|
|
|
|
if ((num - stack[i]) in memo) return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (let i = 1; i <= n; i += 1) {
|
|
|
|
|
if (abundantCheck(i)) {
|
|
|
|
|
abundantList.push(i);
|
|
|
|
|
memo[i] = 1;
|
|
|
|
|
}
|
|
|
|
|
if (checkSum(i, abundantList, memo)) continue;
|
|
|
|
|
sum += i;
|
|
|
|
|
}
|
|
|
|
|
return sum;
|
|
|
|
|
}
|
|
|
|
|
```
|