Files

2.7 KiB
Raw Permalink Blame History

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5900f3a51000cf542c50feb8 Завдання 57: Наближення квадратного кореня 5 302168 problem-57-square-root-convergents

--description--

Можна переконатися в тому, що квадратний корінь з числа два можна виразити у вигляді нескінченного ланцюгового дробу.

$\sqrt 2 =1+ \frac 1 {2+ \frac 1 {2 +\frac 1 {2+ \dots}}}$

Наблизивши цей вираз для перших чотирьох ітерацій, отримаємо:

1 + \\frac 1 2 = \\frac 32 = 1.5

1 + \\frac 1 {2 + \\frac 1 2} = \\frac 7 5 = 1.4

1 + \\frac 1 {2 + \\frac 1 {2+\\frac 1 2}} = \\frac {17}{12} = 1.41666 \\dots

1 + \\frac 1 {2 + \\frac 1 {2+\\frac 1 {2+\\frac 1 2}}} = \\frac {41}{29} = 1.41379 \\dots

Наступні три наближення - \\frac {99}{70}, \\frac {239}{169} та \\frac {577}{408}, але восьме наближення \\frac {1393}{985} є першим прикладом виразу, в якому кількість цифр у чисельнику перевищує кількість цифр у знаменнику.

Скільки дробів містять більше цифр у чисельнику, ніж у знаменнику в перших n наближеннях?

--hints--

squareRootConvergents(10) має повернути число.

assert(typeof squareRootConvergents(10) === 'number');

squareRootConvergents(10) має повернути число 1.

assert.strictEqual(squareRootConvergents(10), 1);

squareRootConvergents(100) має повернути число 15.

assert.strictEqual(squareRootConvergents(100), 15);

squareRootConvergents(1000) має повернути число 153.

assert.strictEqual(squareRootConvergents(1000), 153);

--seed--

--seed-contents--

function squareRootConvergents(n) {

  return true;
}

squareRootConvergents(1000);

--solutions--

function squareRootConvergents(n) {
  function countDigits(number) {
    let counter = 0;
    while (number > 0) {
      counter++;
      number = number / 10n;
    }
    return counter;
  }

  // Use BigInt as integer won't handle all cases
  let numerator = 3n;
  let denominator = 2n;
  let moreDigitsInNumerator = 0;

  for (let i = 2; i <= n; i++) {
    [numerator, denominator] = [
      numerator + 2n * denominator,
      denominator + numerator
    ];

    if (countDigits(numerator) > countDigits(denominator)) {
      moreDigitsInNumerator++;
    }
  }
  return moreDigitsInNumerator;
}