Files

99 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 5900f3a51000cf542c50feb8
title: 'Завдання 57: Наближення квадратного кореня'
challengeType: 5
forumTopicId: 302168
dashedName: problem-57-square-root-convergents
---
# --description--
Можна переконатися в тому, що квадратний корінь з числа два можна виразити у вигляді нескінченного ланцюгового дробу.
<div style='text-align: center;'>$\sqrt 2 =1+ \frac 1 {2+ \frac 1 {2 +\frac 1 {2+ \dots}}}$</div>
Наблизивши цей вираз для перших чотирьох ітерацій, отримаємо:
$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)` має повернути число.
```js
assert(typeof squareRootConvergents(10) === 'number');
```
`squareRootConvergents(10)` має повернути число 1.
```js
assert.strictEqual(squareRootConvergents(10), 1);
```
`squareRootConvergents(100)` має повернути число 15.
```js
assert.strictEqual(squareRootConvergents(100), 15);
```
`squareRootConvergents(1000)` має повернути число 153.
```js
assert.strictEqual(squareRootConvergents(1000), 153);
```
# --seed--
## --seed-contents--
```js
function squareRootConvergents(n) {
return true;
}
squareRootConvergents(1000);
```
# --solutions--
```js
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;
}
```