使用 while 循环页面不断加载(codewars 问题)
using while loop the page keep loading over and over (codewars problem)
大家好,我正在尝试解决阶乘分解(codewars 任务)
好吧,一些数字与我一起工作,直到我到达第 23 页,页面不断循环,请有人帮助我
function decomp(n) {
let c =[]
let sum =1
for(let i=n;i>=1;i--){
sum*=i
}
let k= 2
while(k<=sum){
if(sum%k!==0){
k++}
while(sum%k==0){
c.push(k)
sum = sum/k
}
}
return c.join('*')
}
该函数在我到达数字 23 之前一直运行良好,不断加载,任务是关于函数 decomp(n) 并且应该 return 分解 n!以素数递增的顺序分解成它的素数因子,作为一个字符串。
阶乘可以是一个很大的数字(4000!有 12674 位数字,n 可以从 300 到 4000)。
在 Fortran 中 - 与在任何其他语言中一样 - returned 字符串不允许包含任何多余的尾随空格:您可以使用动态分配的字符串。
例子
n = 12;分解(12)->“2^10 * 3^5 * 5^2 * 7 * 11”
从 12 开始!被2整除十次,被3整除五次,被5整除两次,被7和11整除一次。
n = 22;分解(22)->“2^19 * 3^9 * 5^4 * 7^3 * 11^2 * 13 * 17 * 19”
n = 25;分解 (25) -> 2^22 * 3^10 * 5^6 * 7^3 * 11^2 * 13 * 17 * 19 * 23
23!无法用 double-precision floating-point format 准确表达,JavaScript 用于其数字。
但是,您不需要计算 n!
。您只需要分解每个数字并连接它们的分解。
实际上,您甚至不需要对每个数字进行因式分解。请注意,给定 n
和 p
,有 (n/p)
个数不大于 n
是 p
的倍数, (n/(p*p))
是 p
的倍数p*p
,等等
function *primes(n) {
// Sieve of Eratosthenes
const isPrime = Array(n + 1).fill(true);
isPrime[0] = isPrime[1] = false;
for (let i = 2; i <= n; i++) {
if (isPrime[i]) {
yield i;
for (let j = i * i; j <= n; j += i)
isPrime[j] = false;
}
}
}
function decomp(n) {
let s = n + '! =';
for (const p of primes(n)) {
let m = n, c = 0;
// There are (n/p) numbers no greater than n that are multiples of p
// There are (n/(p*p)) numbers no greater than n that are multiples of p*p
// ...
while (m = ((m / p) | 0)) {
c += m;
}
s += (p == 2 ? ' ' : ' * ') + p + (c == 1 ? '' : '^' + c);
}
return s;
}
console.log(decomp(12))
console.log(decomp(22))
console.log(decomp(23))
console.log(decomp(24))
console.log(decomp(25))
大家好,我正在尝试解决阶乘分解(codewars 任务) 好吧,一些数字与我一起工作,直到我到达第 23 页,页面不断循环,请有人帮助我
function decomp(n) {
let c =[]
let sum =1
for(let i=n;i>=1;i--){
sum*=i
}
let k= 2
while(k<=sum){
if(sum%k!==0){
k++}
while(sum%k==0){
c.push(k)
sum = sum/k
}
}
return c.join('*')
}
该函数在我到达数字 23 之前一直运行良好,不断加载,任务是关于函数 decomp(n) 并且应该 return 分解 n!以素数递增的顺序分解成它的素数因子,作为一个字符串。
阶乘可以是一个很大的数字(4000!有 12674 位数字,n 可以从 300 到 4000)。
在 Fortran 中 - 与在任何其他语言中一样 - returned 字符串不允许包含任何多余的尾随空格:您可以使用动态分配的字符串。
例子
n = 12;分解(12)->“2^10 * 3^5 * 5^2 * 7 * 11”
从 12 开始!被2整除十次,被3整除五次,被5整除两次,被7和11整除一次。
n = 22;分解(22)->“2^19 * 3^9 * 5^4 * 7^3 * 11^2 * 13 * 17 * 19”
n = 25;分解 (25) -> 2^22 * 3^10 * 5^6 * 7^3 * 11^2 * 13 * 17 * 19 * 23
23!无法用 double-precision floating-point format 准确表达,JavaScript 用于其数字。
但是,您不需要计算 n!
。您只需要分解每个数字并连接它们的分解。
实际上,您甚至不需要对每个数字进行因式分解。请注意,给定 n
和 p
,有 (n/p)
个数不大于 n
是 p
的倍数, (n/(p*p))
是 p
的倍数p*p
,等等
function *primes(n) {
// Sieve of Eratosthenes
const isPrime = Array(n + 1).fill(true);
isPrime[0] = isPrime[1] = false;
for (let i = 2; i <= n; i++) {
if (isPrime[i]) {
yield i;
for (let j = i * i; j <= n; j += i)
isPrime[j] = false;
}
}
}
function decomp(n) {
let s = n + '! =';
for (const p of primes(n)) {
let m = n, c = 0;
// There are (n/p) numbers no greater than n that are multiples of p
// There are (n/(p*p)) numbers no greater than n that are multiples of p*p
// ...
while (m = ((m / p) | 0)) {
c += m;
}
s += (p == 2 ? ' ' : ' * ') + p + (c == 1 ? '' : '^' + c);
}
return s;
}
console.log(decomp(12))
console.log(decomp(22))
console.log(decomp(23))
console.log(decomp(24))
console.log(decomp(25))