Факториал числа — это произведение натуральных чисел от 1 до самого числа (включая данное число). Факториал нуля и единицы равен 1.
Напишите функцию factorial, которая принимает число number и возвращает факториал этого числа.
Примеры:
функция factorial(0) должна возвратить 1;
функция factorial(1) должна возвратить 1;
функция factorial(2) должна возвратить 2 (т. к. 1 * 2 = 2);
функция factorial(4) должна возвратить 24 (т. к. 1 * 2 * 3 * 4 = 24).
функция factorial(5) должна возвратить 120 (т. к. 1 * 2 * 3 * 4 * 5 = 120).
JavaScript
Факториал числа JS
в чём вопрос?
ладно, давай немного разнообразия
https://jsfiddle.net/yLat973x/
function factorial(n) {
return _factorial(n, primes(n))
}
function _factorial(n, primes) {
if (n < 2) return 1
const factorialNumber = _factorial(Math.floor(n / 2), primes)
const primeSwingNumber = primeSwing(n, primes)
return factorialNumber ** 2 * primeSwingNumber
}
function primeSwing(n, primes) {
const multipliers = []
for (let i = 0; i < primes.length && primes[i] <= n; i++) {
const prime = primes[i]
let p = 1
let q = n
while (q !== 0) {
q = Math.floor(q / prime)
if (q % 2 === 1) {
p = p * prime
}
}
if (p !== 1) {
multipliers.push(p)
}
}
return product(multipliers, 0, multipliers.length - 1)
}
function product(multipliers, i, j) {
if (i > j) return 1
if (i === j) return multipliers[i]
let k = (i + j) >>> 1
return product(multipliers, i, k) * product(multipliers, k + 1, j)
}
function primes(upTo) {
upTo++
if (upTo >= 0 && upTo < 3) return []
let length = upTo >>> 1
const sieve_bool = Array.from({
length
}, () => false)
for (let i = 1, iterations = Math.sqrt(length - 1); i < iterations; i++) {
if (!sieve_bool[i]) {
for (let step = 2 * i + 1, j = i * (step + 1); j < length; j += step) {
sieve_bool[j] = true
}
}
}
let not_primes = 0
for (let not_prime of sieve_bool) {
if (not_prime) not_primes++
}
let sieve_int = Array(length - not_primes)
sieve_int[0] = 2
for (let i = 1, j = 1; i < length; i++) {
if (!sieve_bool[i]) {
sieve_int[j++] = 2 * i + 1
}
}
return sieve_int
}
https://jsfiddle.net/yLat973x/
function factorial(n) {
return _factorial(n, primes(n))
}
function _factorial(n, primes) {
if (n < 2) return 1
const factorialNumber = _factorial(Math.floor(n / 2), primes)
const primeSwingNumber = primeSwing(n, primes)
return factorialNumber ** 2 * primeSwingNumber
}
function primeSwing(n, primes) {
const multipliers = []
for (let i = 0; i < primes.length && primes[i] <= n; i++) {
const prime = primes[i]
let p = 1
let q = n
while (q !== 0) {
q = Math.floor(q / prime)
if (q % 2 === 1) {
p = p * prime
}
}
if (p !== 1) {
multipliers.push(p)
}
}
return product(multipliers, 0, multipliers.length - 1)
}
function product(multipliers, i, j) {
if (i > j) return 1
if (i === j) return multipliers[i]
let k = (i + j) >>> 1
return product(multipliers, i, k) * product(multipliers, k + 1, j)
}
function primes(upTo) {
upTo++
if (upTo >= 0 && upTo < 3) return []
let length = upTo >>> 1
const sieve_bool = Array.from({
length
}, () => false)
for (let i = 1, iterations = Math.sqrt(length - 1); i < iterations; i++) {
if (!sieve_bool[i]) {
for (let step = 2 * i + 1, j = i * (step + 1); j < length; j += step) {
sieve_bool[j] = true
}
}
}
let not_primes = 0
for (let not_prime of sieve_bool) {
if (not_prime) not_primes++
}
let sieve_int = Array(length - not_primes)
sieve_int[0] = 2
for (let i = 1, j = 1; i < length; i++) {
if (!sieve_bool[i]) {
sieve_int[j++] = 2 * i + 1
}
}
return sieve_int
}
Похожие вопросы
- вопрос про JS, рандом чисел в %
- Помогите определиться с выбором нового языка (JS(TS) vs Java)
- Js фреймворки, что полезного можно для себя найти?
- В чем цель фреймворков js web?
- [HTML/CSS/JS] Как сохранять изменённые в .js данные оффлайн-сервера локально?
- Помогите с кодом JS. Как в данном случае вывести сообщение о равных числах?
- Вывод чисел в JS
- Почему jQuery методы популярнее js методов при общении с ДоМ?
- ПОЧЕМУ JS ТАКОЙ НЕПОНЯТНЫЙ???
- вопрос по JS. " простой ()";