2016-10-25 11 views
5

Biến này x chứa số cần được kiểm tra đối với một mảng. var x = 10; var ary = [ 3,5 ]Cách tách rời một số bằng các khoản tiền cụ thể

Tôi muốn thử nghiệm nếu x có thể được bù đắp bằng số tiền của bất kỳ sự kết hợp của các phím trong ary, sau đó hiển thị những phím làm thêm lên để làm x.

Trong trường hợp này, không thể sử dụng 3. Vì vậy, kết quả sẽ = 5, 5 nếu x = 10 (vì chức năng sẽ tìm kiếm mảng và tìm thấy 5 + 5 bằng 10)

Độ dài của mảng và x không được biết. Tôi không sử dụng bất kỳ thư viện nào. Đây là cách xa tôi đã đến vậy, đến nay:

var x = 10; 
 
var ary = [ 3, 5 ]; 
 

 
function cycle(){ 
 
    var result; 
 
    for(var i = 0; i < ary.length; i++){ 
 
    if(ary[ i ] + ary[ i ] == x){ 
 
     result = ary[ i ] + ',' + ary[ i ]; 
 
    } 
 
    else if(ary[ i ] + ary[ i + 1 ] == x){ 
 
     result = ary[ i ] + ',' + ary[ i + 1 ]; 
 
    } 
 
    else if(ary[ i + 1 ] + ary[ i + 1 ] == x){ 
 
     result = ary[ i + 1 ] + ',' + ary[ i + 1 ]; 
 
    } 
 
    return result; 
 
    } 
 
} 
 
    
 

 
var result = cycle(); 
 
document.write(result);

tôi biết mã trên là khủng khiếp, không linh hoạt trong ít nhất, và chỉ hoạt động trong trường hợp cụ thể tôi sử dụng nó cho. Làm cách nào để bao gồm tất cả các kết hợp có thể là?

Giả sử mảng vẫn chỉ có 2 giá trị 35, ở đây có nhiều ví dụ như thế nào những gì kết quả sẽ nhận được dựa trên x:

nếu x = 8, kết quả sẽ = 3, 5;

nếu x = 15, kết quả sẽ = 5, 5, 5

nếu x = 9, kết quả sẽ = 3, 3, 3, vv

Note: Không nên có giới hạn bao nhiêu lần một chìa khóa có thể được sử dụng.

+0

Tại sao chỉ số cùng bổ sung vào bản thân tại 'ary [i] + ary [i] == x'? – guest271314

+0

@ guest271314 Mục đích là để kiểm tra xem có bất kỳ khoản tiền nào cộng thêm x không. Bao gồm việc thêm các chỉ mục vào chính nó tuy nhiên nhiều lần để có được x. Hoặc thêm nó vào bất kỳ chỉ mục nào khác cộng với chính nó để có được x. –

+1

Phân vùng thuật toán số có thể giúp bạn http://stackoverflow.com/questions/400794/generating-the-partitions-of-a-number –

Trả lời

2

Bạn có thể sử dụng phép nhân. Tạo một mảng có .length bằng số lớn nhất trong mảng đầu vào ary cộng với 1, nhân chỉ mục của mảng theo số hiện tại, nếu sản phẩm bằng số mục tiêu, tạo một mảng có .length bằng index và điền vào mảng với phần tử hiện tại của ary, nếu không thiết lập chỉ số kết quả của mảng được trả về cho số đầu vào.

const x = [8, 9, 10, 15]; 
 
let ary = [3, 5]; 
 

 
let nums = (n, arr) => { 
 
    let [keys, res] = [ 
 
    Array.from(Array(Math.max.apply(Math, arr) + 1).keys()).splice(1) 
 
    , Array() 
 
    ]; 
 
    for (let prop of arr) { 
 
    for (let index of keys) { 
 
     if (prop * index <= n) { 
 
     if (prop * index === n) { 
 
      res.push(Array(index).fill(prop)); break; 
 
     } 
 
     } else { 
 
     res.push(prop); break; 
 
     } 
 
    } 
 
    } 
 
    return {x:n, result:res}; 
 
} 
 

 
for (let num of x) console.log(nums(num, ary));

+0

Cảm ơn câu trả lời của bạn. Đây là cách bắt đầu tốt hơn tôi có. Vấn đề duy nhất là khi tôi tiếp tục thay đổi giá trị của 'x' chức năng không phù hợp với những gì tôi đang tìm kiếm. Ví dụ khi 'x = 15' kết quả là' 5, 5' trong đó '5, 5, 5' là mong muốn. Tôi sẽ nghiên cứu điều này và cố gắng tinh chỉnh nó. Cảm ơn. –

+0

@ css.architect Xem bài đăng cập nhật. – guest271314

Các vấn đề liên quan