Hướng dẫn find divisors of a number javascript - tìm ước của một số javascript

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
    function(n){
        var arr = [],
            finalSum;
    
        if(n <= 1 || 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. 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.

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 <= `sqrt(n)`, so we try these first:
    while (factor * factor <= n) {
        if (n % factor === 0) {
            // `factor` is a prime factor of `n`, determine the exponent:
            var exponent = 0;
            do {
                n /= factor;
                exponent++;
            } while (n % factor === 0)
            // `factor^exponent` is one term in the prime factorization of n,
            // this contributes as factor `exponent + 1`:
            numDivisors *= exponent + 1;
        }
        // Next possible prime factor:
        factor = factor == 2 ? 3 : factor + 2
    }

    // Now `n` is either 1 or a prime number. In the latter case,
    // it contributes a factor 2:
    if (n > 1) {
        numDivisors *= 2;
    }

    return numDivisors;
}

Ví dụ,

function(n){
    var arr = [],
        finalSum;

    if(n <= 1 || 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;
}
1 yêu cầu 720 hoạt động còn lại trong thuật toán của bạn, nhưng chỉ có 8 hoạt động còn lại và 6 bộ phận trong thuật toán này.

Tôi đang thực hiện một số bài tập mã hóa và tôi không thể giải quyết vấn đề này.

Tìm tổng của tất cả các ước số của một số nguyên nhất định. Đối với n = 12, đầu vào phải là sumofdivisors (n) = 28.

Ví dụ: 1 + 2 + 3 + 4 + 6 + 12 = 28.

Các ràng buộc: 1 ≤ N ≤ 15.

Làm thế nào tôi có thể giải quyết bài tập này? Tôi không thể.

function(n){
    var arr = [],
        finalSum;

    if(n <= 1 || 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;
}

Đã hỏi ngày 31 tháng 3 năm 2017 lúc 22:21Mar 31, 2017 at 22:21

Franco Manzurfranco ManzurFranco Manzur

3531 Huy hiệu vàng7 Huy hiệu bạc18 Huy hiệu đồng1 gold badge7 silver badges18 bronze badges

Đây là một cách khác để làm điều đó:

var divisors = n=>[...Array(n+1).keys()].slice(1)
   .reduce((s, a)=>s+(!(n % a) && a), 0);

console.log(divisors(12));

JSfiddle: https://jsfiddle.net/32n5jdnb/141/

Explaining:

  • function(n){
        var arr = [],
            finalSum;
    
        if(n <= 1 || 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;
    }
    
    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 <= 1 || 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+1
  • function(n){
        var arr = [],
            finalSum;
    
        if(n <= 1 || 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 <= 1 || 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 <= 1 || 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 <= 1 || 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án
  • function(n){
        var arr = [],
            finalSum;
    
        if(n <= 1 || 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 <= 1 || 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ị.
  • var divisors = n=>[...Array(n+1).keys()].slice(1)
       .reduce((s, a)=>s+(!(n % a) && a), 0);
    
    console.log(divisors(12));
    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ếu
    var 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.

Giảm tài liệu: https://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

Hướng dẫn find divisors of a number javascript - tìm ước của một số javascript

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 <= num; i++){
    if (!(num % i)) {
      sum += i;
    }
  }
  console.log(sum);
}

sumDivisors(6);
sumDivisors(10);

Đã trả lời ngày 31 tháng 3 năm 2017 lúc 22:28Mar 31, 2017 at 22:28

Hướng dẫn find divisors of a number javascript - tìm ước của một số javascript

Dưới đây là một giải pháp với hiệu suất thuật toán tốt hơn (O (SQRT (yếu tố chính lớn nhất của N)))

divisors = n => {
  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

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 <= n/2; i++){
  n % i === 0 ? counter++ : null;
 }
 return counter
}  

Trong trường hợp này, chúng tôi coi bộ đếm của chúng tôi là bắt đầu với 1 vì theo mặc định, tất cả các số đều chia hết cho 1. Sau đó, chúng tôi một nửa số vì các số có thể chia n ít hơn hoặc bằng một nửa giá trị của nó

Đã trả lời ngày 6 tháng 3 lúc 22:00Mar 6 at 22:00

Hướng dẫn find divisors of a number javascript - tìm ước của một số javascript

AlkarialkariAlkari

932 huy hiệu bạc11 huy hiệu đồng2 silver badges11 bronze badges

Làm thế nào để bạn tìm thấy các ước số của một số?

Công thức tính toán tổng số chia của một số ′ n ′ trong đó n có thể được biểu diễn dưới dạng công suất của số nguyên tố được hiển thị là.If n = paQbrc .then tổng số chia = (a+1) (b+1) (c+1).If N=paqbrc . Then total number of divisors =(a+1)(b+1)(c+1).

Làm thế nào để bạn tìm thấy các ước số của một số trong java?

Để có được ước số của một số N, chúng ta nên chia n cho tất cả các số ở giữa 1 và N bao gồm 1 và N. Chúng ta sẽ sử dụng toán tử Modulus đưa ra lời nhắc.Nếu nhắc nhở bằng không, chúng ta có thể nói số đã cho chia hết cho một số khác.Đối với Ex: 10%2 = 0 (10 chia hết cho 2 mà không cần nhắc nhở)divide N by all numbers in between 1 and N including 1 and N. We will use modulus operator which gives reminder. If reminder is zero, we can say given number is divisible by another number. For ex: 10%2= 0 (10 is divisible by 2 without a reminder)

Làm thế nào để bạn nhân tố trong JavaScript?

Lao động một số với đệ quy.hàm factorialize (num) {// Nếu số nhỏ hơn 0, hãy từ chối nó.if (num <0) return -1;// Nếu số là 0, giai thừa của nó là 1. ....
Lao động một số với một vòng lặp trong thời gian.hàm factorialize (num) {// bước 1. ....
Factorial một số với một vòng lặp ..