2016-10-25 2 views
5

Ta zmienna x zawiera liczbę, która musi być przetestowana względem tablicy. var x = 10; var ary = [ 3,5 ]Sposób dzielenia liczby przez konkretne sumy

chcę przetestować jeśli x mogą być wykonane przez sumę dowolnej kombinacji klawiszy w ary, a następnie pokazać, co klucze sumują się do x.

W tym przypadku nie można użyć 3. Tak więc wynik będzie = 5, 5, jeśli x = 10 (ponieważ funkcja powinna przeszukiwać tablicę i stwierdzić, że 5 + 5 równa się 10)

Długość tablicy i x nie są znane. Nie używam żadnych bibliotek. Jest to, jak daleko doszedłem tak daleko:

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);

wiem powyższy kod jest straszna, nie elastyczny w najmniejszym stopniu, a działa tylko w tym szczególnym przypadku używam go. W jaki sposób mogę uwzględnić dostępne kombinacje wszystkie?

Zakładając tablica nadal ma tylko wartości 2 3 i 5, oto więcej przykładów jak co byłoby uzyskać wynik w oparciu o X:

jeśli x = 8, wynik byłby = 3, 5;

jeśli x = 15, wynik byłby = 5, 5, 5

jeśli x = 9, wynik byłby = 3, 3, 3 itp

Uwaga: Nie powinno być żadnych ograniczeń co do tego, ile razy klucz może być używany.

+0

co jest taki sam indeks dodawane do siebie w 'ary [b] + ary [i] == x'? – guest271314

+0

@ guest271314 Celem było sprawdzenie, czy jakiekolwiek sumy sumują się do x. W tym dodawanie indeksów do siebie, jednak wiele razy, aby uzyskać x. Lub dodanie go do dowolnego innego indeksu plus siebie, aby uzyskać x. –

+1

Partycja algorytmu liczby może Ci pomóc http://stackoverflow.com/questions/400794/generating-the-partitions-of-a-number –

Odpowiedz

2

Możesz użyć mnożenia. Utwórz tablicę o numerze równym największej liczbie w tablicy wejściowej ary oraz 1, pomnóż indeks tablicy przez bieżącą liczbę, jeśli produkt jest równy numerowi docelowemu, utwórz tablicę o wartości .length równą index i wypełnij tablicę bieżącym elementem z ary, w przeciwnym razie ustaw wynikowy indeks zwróconej tablicy na numer wejściowy.

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

Dzięki za odpowiedź. To lepszy start niż ja. Jedynym problemem jest to, że ciągle zmieniając wartość 'x' funkcja nie jest zgodna z tym, czego szukam. Na przykład, gdy 'x = 15', wynikiem jest' 5, 5', gdzie pożądane jest '5, 5, 5'. Zbadam to i spróbuję go ulepszyć. Dzięki. –

+0

@ css.architect Zobacz zaktualizowany post. – guest271314