2.4 KiB
2.4 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5900f3bc1000cf542c50fecf | Problema 80: Expansão de dígitos da raiz quadrada | 5 | 302194 | problem-80-square-root-digital-expansion |
--description--
É do conhecimento geral que se a raiz quadrada de um número natural não é um número inteiro, então é irracional. A expansão decimal de tais raízes quadradas é infinita sem qualquer tipo de padrão de repetição.
A raiz quadrada de dois é 1.41421356237309504880...
. A soma dos dígitos das primeiras cem casas decimais é 475
.
Para os primeiros n
números naturais, encontre o total das somas dos dígitos das primeiras cem casas decimais para todas as raízes quadradas irracionais.
--hints--
sqrtDigitalExpansion(2)
deve retornar um número.
assert(typeof sqrtDigitalExpansion(2) === 'number');
sqrtDigitalExpansion(2)
deve retornar 475
.
assert.strictEqual(sqrtDigitalExpansion(2), 475);
sqrtDigitalExpansion(50)
deve retornar 19543
.
assert.strictEqual(sqrtDigitalExpansion(50), 19543);
sqrtDigitalExpansion(100)
deve retornar 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;
}