freeCodeCamp/curriculum/challenges/portuguese/10-coding-interview-prep/project-euler/problem-80-square-root-digi...

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;
}