Một số nhận xét chung:
- Các biến nên được khai báo rõ ràng với
var
, nếu không bạn tạo một biến toàn cầu. - Lượng thụt lại khác nhau giữa cấp độ đầu tiên và cấp độ sâu hơn.
- Khoảng cách không nhất quán:
while [
so với
0. Nói chung tôi sẽ chèn một không gian ít nhất là sau các từ khóa và xung quanh dấu ngoặc đơn/niềng răng, v.v.function[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
Việc thực hiện của bạn là chính xác nhưng không hiệu quả, vì số lần lặp vòng lặp và hoạt động còn lại bằng với số đầu vào.
Số lượng các ước số có thể được tính toán hiệu quả từ hệ số số nguyên tố: nếu $$ n = p_1^{e_1} \, p_2^{e_2} \ cdots p_k^{e_k} $$ là yếu tố của \ $ n \ $ vào Số nguyên tố \ $ p_i \ $ với số mũ \ $ e_i \ $, sau đó $$ \ sigma_0 [n] = [e_1+1] [e_2+1] $ n \ $, xem ví dụ Wikipedia: Hàm chia. Ví dụ: $$ 720 = 2^4 \ cdot 3^2 \ cdot 5^1 \ longrightarrow \ sigma_0 [720] = [4+1] [2+1] [1+1] = 30 \,. $$
Một triển khai trong JavaScript sẽ là
function getDivisorsCnt[n]{
var numDivisors = 1;
var factor = 2; // Candidate for prime factor of `n`
// If `n` is not a prime number then it must have one factor
// which is [...Array[n+1].keys[]].slice[1]
.reduce[[s, a]=>s+[![n % a] && a], 0];
console.log[divisors[12]];
JSfiddle: //jsfiddle.net/32n5jdnb/141/
Explaining:
2 Đây là một hàm mũi tên, tương đương với hàm [n] {. Bạn không cần [] nếu chỉ có một tham số.function[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
3 tạo ra một mảng trống gồm các phần tử N+1function[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
4 Nhận các phím của mảng trống [các chỉ mục, tức là 0, 1, 2] vì vậy đây là một cách để tạo một chuỗi sốfunction[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
5 sử dụng toán tử lây lan [...] để chuyển đổi trình lặp trong một mảng khác để tạo một mảng với chuỗi sốfunction[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
6 loại bỏ phần tử đầu tiên do đó tạo ra một chuỗi bắt đầu bằng 1. Ghi nhớ N+1?function[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
7 là một phương thức lặp lại mặc dù mỗi phần tử và tính toán một giá trị để giảm mảng xuống một giá trị. Nó nhận được là tham số một hàm gọi lại để tính giá trị và giá trị ban đầu của tính toánfunction[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
8 là chức năng gọi lại để giảm. Đó là một hàm mũi tên tương đương với hàm [s, a] {function[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
9 là tính toán giá trị.function[n]{ var arr = [], finalSum; if[n 16]{ return false ; } for[var i = 0; i < n; i++]{ var tmp= n/2; arr.push[tmp] // i need to keep on dividing n but i can't get the way of how to } return finalSum; }
0 s [cho tổng] hoặc giá trị cuối cùng được tính toán +var divisors = n=>[...Array[n+1].keys[]].slice[1] .reduce[[s, a]=>s+[![n % a] && a], 0]; console.log[divisors[12]];
1 Điều này trả về chỉ đúng cho các phần tử có giá trị 0 là mô -đun.var divisors = n=>[...Array[n+1].keys[]].slice[1] .reduce[[s, a]=>s+[![n % a] && a], 0]; console.log[divisors[12]];
2 là một trò lừa 'của JS. Trường hợp là các biểu thức boolean trong javascript không trả về đúng hoặc sai. Họ trả lại giá trị 'sự thật' hoặc 'giả' sau đó được chuyển đổi thành Boolean. Vì vậy, giá trị trả về thực tế là giá trị phù hợp cho && [xem xét cả hai phải là sự thật] và giá trị thuthy đầu tiên được tìm thấy cho || [Chỉ xem xét một người cần phải là sự thật]. Vì vậy, điều này về cơ bản có nghĩa là: nếuvar divisors = n=>[...Array[n+1].keys[]].slice[1] .reduce[[s, a]=>s+[![n % a] && a], 0]; console.log[divisors[12]];
3 là giá trị mô -đun [nghĩa là! = 0] trả vềvar divisors = n=>[...Array[n+1].keys[]].slice[1] .reduce[[s, a]=>s+[![n % a] && a], 0]; console.log[divisors[12]];
3 để thêm vào tổng, nếu không trả về 0.var divisors = n=>[...Array[n+1].keys[]].slice[1] .reduce[[s, a]=>s+[![n % a] && a], 0]; console.log[divisors[12]];
5 là giá trị ban đầu cho phép tính giảm.var divisors = n=>[...Array[n+1].keys[]].slice[1] .reduce[[s, a]=>s+[![n % a] && a], 0]; console.log[divisors[12]];
Giảm tài liệu: //developer.mozilla.org/pt-r/docs/web/javascript/reference/global_objects/array/reduce
Chỉnh sửa
Trả lời Tristan về phía trước:
var divisorsList = [];
var divisors = [n]=>[...Array[n+1].keys[]].slice[1]
.reduce[[s, a]=>{
var divisor = ![n % a] && a;
if [divisor] divisorsList.push[divisor];
return s+divisor;
}, 0];
console.log['Result:', divisors[12]];
console.log['Divisors:', divisorsList];
Đã trả lời ngày 31 tháng 3 năm 2017 lúc 22:58Mar 31, 2017 at 22:58
Nelson Teixeiranelson TeixeiraNelson Teixeira
5.9375 Huy hiệu vàng36 Huy hiệu bạc68 Huy hiệu Đồng5 gold badges36 silver badges68 bronze badges
3
Bạn phải kiểm tra xem số được chỉ định có hay không là một số chia của số nguyên đã cho. Bạn có thể sử dụng modulo
var divisors = n=>[...Array[n+1].keys[]].slice[1]
.reduce[[s, a]=>s+[![n % a] && a], 0];
console.log[divisors[12]];
6 - nếu không có phần còn lại, số được chỉ định là chia của số nguyên đã cho - thêm nó vào tổng.function sumDivisors[num]{
var sum = 0;
for [var i = 1; i {
sum = 1
for [i = 2; n > 1; i++] {
i * i > n ? i = n : 0
b = 0
while [n % i < 1] {
c = sum * i
sum += c - b
b = c
n /= i
}
}
return sum
}
Đã trả lời ngày 24 tháng 9 năm 2019 lúc 7:16Sep 24, 2019 at 7:16
1
Vì
var divisors = n=>[...Array[n+1].keys[]].slice[1]
.reduce[[s, a]=>s+[![n % a] && a], 0];
console.log[divisors[12]];
7 cũng là một Duvisor, điều này có thể được thực hiện hiệu quả hơn.function sumDivisors[num] {
let sum = 1;
for [let i = 2; i < num / i; i++] {
if [num % i === 0] {
sum += i + num / i;
}
}
const sqrt = Math.sqrt[num];
return num + [num % sqrt === 0 ? sum + sqrt : sum];
}
Đã trả lời ngày 3 tháng 9 năm 2021 lúc 13:44Sep 3, 2021 at 13:44
LancelanceLance
6575 Huy hiệu bạc20 Huy hiệu Đồng5 silver badges20 bronze badges
function countDivisors[n]{
let counter = 1;
for[let i=1; i