2.5 KiB
id, title, challengeType, forumTopicId, dashedName
| id | title | challengeType | forumTopicId | dashedName |
|---|---|---|---|---|
| 5900f37a1000cf542c50fe8d | Problem 14: Längste Collatz-Reihenfolge | 1 | 301768 | problem-14-longest-collatz-sequence |
--description--
Die folgende Iterationsfolge ist für die Menge der positiven ganzen Zahlen definiert:
Unter Anwendung der obigen Regel, beginnend mit 13, ergibt sich die folgende Reihenfolge:
Man sieht, dass diese Reihenfolge (die bei 13 beginnt und bei 1 endet) 10 Terme enthält. Obwohl es noch nicht bewiesen ist (Collatz-Problem), geht man davon aus, dass alle Anfangszahlen bei 1 enden.
Welche Startnummer ergibt unter dem gegebenen limit die längste Kette?
Hinweis: Sobald die Kette beginnt, dürfen die Begriffe über limit hinausgehen.
--hints--
longestCollatzSequence(14) sollte eine Zahl zurückgeben.
assert(typeof longestCollatzSequence(14) === 'number');
longestCollatzSequence(14) sollte 9 zurückgeben.
assert.strictEqual(longestCollatzSequence(14), 9);
longestCollatzSequence(5847) sollte 3711 zurückgeben.
assert.strictEqual(longestCollatzSequence(5847), 3711);
longestCollatzSequence(46500) sollte 35655 zurückgeben.
assert.strictEqual(longestCollatzSequence(46500), 35655);
longestCollatzSequence(54512) sollte 52527 zurückgeben.
assert.strictEqual(longestCollatzSequence(54512), 52527);
longestCollatzSequence(100000) sollte 77031 zurückgeben.
assert.strictEqual(longestCollatzSequence(100000), 77031);
longestCollatzSequence(1000000) sollte 837799 zurückgeben.
assert.strictEqual(longestCollatzSequence(1000000), 837799);
--seed--
--seed-contents--
function longestCollatzSequence(limit) {
return true;
}
longestCollatzSequence(14);
--solutions--
function longestCollatzSequence(limit) {
let longest = 1;
let maxLength = 1;
for (let i = Math.floor(limit / 2); i < limit; i++) {
let len = colLen(i);
if (len > maxLength) {
longest = i;
maxLength = len;
}
}
return longest;
}
const knownSequence = { '1': 1 };
function colLen(n) {
if (knownSequence[n]) {
return knownSequence[n];
} else {
const len = n % 2 === 0 ? colLen(n / 2) + 1 : colLen((3 * n + 1) / 2) + 2;
knownSequence[n] = len;
return len;
}
}