2.4 KiB
2.4 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5900f3bc1000cf542c50fecf | Problema 80: Espansione digitale della radice quadrata | 5 | 302194 | problem-80-square-root-digital-expansion |
--description--
È noto che se la radice quadrata di un numero naturale non è un intero, allora è irrazionale. L'espansione decimale di tali radici quadrate è infinita senza alcun pattern di ripetizione.
La radice quadrata di due è 1.41421356237309504880...
, e la somma digitale delle prime cento cifre decimali è 475
.
Per i primi n
numeri naturali, trova il totale delle somme digitali delle prime cento cifre decimali per tutte le radici quadrate irrazionali.
--hints--
sqrtDigitalExpansion(2)
dovrebbe restituire un numero.
assert(typeof sqrtDigitalExpansion(2) === 'number');
sqrtDigitalExpansion(2)
dovrebbe restituire 475
.
assert.strictEqual(sqrtDigitalExpansion(2), 475);
sqrtDigitalExpansion(50)
dovrebbe restituire 19543
.
assert.strictEqual(sqrtDigitalExpansion(50), 19543);
sqrtDigitalExpansion(100)
dovrebbe restituire 40886
.
assert.strictEqual(sqrtDigitalExpansion(100), 40886);
--seed--
--seed-contents--
function sqrtDigitalExpansion(n) {
return true;
}
sqrtDigitalExpansion(2);
--solutions--
function sqrtDigitalExpansion(n) {
function sumDigits(number) {
let sum = 0;
while (number > 0n) {
let digit = number % 10n;
sum += parseInt(digit, 10);
number = number / 10n;
}
return sum;
}
function power(numberA, numberB) {
let result = 1n;
for (let b = 0; b < numberB; b++) {
result = result * BigInt(numberA);
}
return result;
}
// Based on http://www.afjarvis.staff.shef.ac.uk/maths/jarvisspec02.pdf
function expandSquareRoot(number, numDigits) {
let a = 5n * BigInt(number);
let b = 5n;
const boundaryWithNeededDigits = power(10, numDigits + 1);
while (b < boundaryWithNeededDigits) {
if (a >= b) {
a = a - b;
b = b + 10n;
} else {
a = a * 100n;
b = (b / 10n) * 100n + 5n;
}
}
return b / 100n;
}
let result = 0;
let nextPerfectRoot = 1;
const requiredDigits = 100;
for (let i = 1; i <= n; i++) {
if (nextPerfectRoot ** 2 === i) {
nextPerfectRoot++;
continue;
}
result += sumDigits(expandSquareRoot(i, requiredDigits));
}
return result;
}