fix(curriculum): rework Project Euler 64 (#41764)

* fix: rework challenge to use argument in function

* fix: add solution
pull/41782/head
gikf 2021-04-08 20:19:59 +02:00 committed by GitHub
parent fe95d5bca2
commit 23e7d8019d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 56 additions and 8 deletions

View File

@ -64,20 +64,38 @@ $\\quad \\quad \\sqrt{13}=\[3;(1,1,1,1,6)]$, period = 5
Exactly four continued fractions, for $N \\le 13$, have an odd period.
How many continued fractions for $N \\le 10\\,000$ have an odd period?
How many continued fractions for $N \\le n$ have an odd period?
# --hints--
`oddPeriodSqrts()` should return a number.
`oddPeriodSqrts(13)` should return a number.
```js
assert(typeof oddPeriodSqrts() === 'number');
assert(typeof oddPeriodSqrts(13) === 'number');
```
`oddPeriodSqrts()` should return 1322.
`oddPeriodSqrts(500)` should return `83`.
```js
assert.strictEqual(oddPeriodSqrts(), 1322);
assert.strictEqual(oddPeriodSqrts(500), 83);
```
`oddPeriodSqrts(1000)` should return `152`.
```js
assert.strictEqual(oddPeriodSqrts(1000), 152);
```
`oddPeriodSqrts(5000)` should return `690`.
```js
assert.strictEqual(oddPeriodSqrts(5000), 690);
```
`oddPeriodSqrts(10000)` should return `1322`.
```js
assert.strictEqual(oddPeriodSqrts(10000), 1322);
```
# --seed--
@ -85,16 +103,46 @@ assert.strictEqual(oddPeriodSqrts(), 1322);
## --seed-contents--
```js
function oddPeriodSqrts() {
function oddPeriodSqrts(n) {
return true;
}
oddPeriodSqrts();
oddPeriodSqrts(13);
```
# --solutions--
```js
// solution required
function oddPeriodSqrts(n) {
// Based on https://www.mathblog.dk/project-euler-continued-fractions-odd-period/
function getPeriod(num) {
let period = 0;
let m = 0;
let d = 1;
let a = Math.floor(Math.sqrt(num));
const a0 = a;
while (2 * a0 !== a) {
m = d * a - m;
d = Math.floor((num - m ** 2) / d);
a = Math.floor((Math.sqrt(num) + m) / d);
period++;
}
return period;
}
function isPerfectSquare(num) {
return Number.isInteger(Math.sqrt(num));
}
let counter = 0;
for (let i = 2; i <= n; i++) {
if (!isPerfectSquare(i)) {
if (getPeriod(i) % 2 !== 0) {
counter++;
}
}
}
return counter;
}
```