Alexandroppolus,
почему при М = 6 у вас иной подсчёт, чем при М = 5? |
Цитата:
function calculation(M,N){ var количество = 0; for(var k = Math.pow(10, M - 1); k <= Math.pow(10, M) - 1; k++){ const число = String(k); const цифры = [...число]; var сумма = 0; for(var i = 0; i < M; i += 2) { сумма += +цифры[i]; } if(сумма === N) количество++; } return количество; } alert(calculation(5,5) * 10 === calculation(6,5)); |
Alexandroppolus,
:) не учёл что речь была о младшем разряде, считал первую цифру нечётной. вопрос исчерпан.:thanks: |
(1<N<90, 5<M<20)
поскольку при этих ограничениях результат не всегда влезает в Number.MAX_SAFE_INTEGER, то возвращаем его в виде строки :) https://jsfiddle.net/bw783h4j/ |
Alexandroppolus,
ничего не понял, но спасибо! :) |
Alexandroppolus,
Спасибо большое за ваш труд! Не могли бы вы еще раз попроще объяснить, что происходит в функции sumCount() ? |
ProgYoung,
функциия sumCount определяет, сколькими способами можно разложить число n на m слагаемых, так что каждое слагаемое будет в пределах от 0 до 9, а первое слагаемое - от f до 9. Она работает рекурсивно - в цикле перебирает все возможные значения первого слагаемого и на каждой итерации считает sumCount(m-1, n-i) - т.е. если первое число взять равным i, то сколько будет вариантов по остальным числам и оставшейся сумме. Это всё суммируется. Массив saved - для сохранения значений sumCount(m, n), т.к. они часто будут повторяться: например, если первые два слагаемых равны (1, 7), (2, 6) и т.д., то оставшаяся сумма одинакова. т.е. sumCount как раз и делает подсчет вариантов для нечетных разрядов, коих оказалось примерно половина от всех разрядов числа. |
Alexandroppolus,
почему первое слагаемое от f, а не от 1? Еще у меня так и не выводит ответ, хотя вроде все правильно (я сохраняю текстовый документ, как .html и открываю в гугле): <!DOCTYPE html> <html> <head> <META http-equiv="Content-Type" content="text/html; charset=windows-1251"/> <title></title> </head> <body> <p>Введите число N - сумма чисел в нечетных разрядах:</p> <input type="text" id="n" size="10" maxlength="15"/> <p>Введите число M (M-значные числа):</p> <input type="text" id="m" size="10" maxlength="15"/> <p id="solution">Решение</p> <p><textarea id="solve" rows="15" cols="40"></textarea></p> <script type="text/javascript"> var calculation = function() { function sumCount(f, m, n, saved) { if (m < 2) { return n < 10 && n >= f ? 1 : 0; } if (n < 1) { return 1 - f; } if (saved[m][n] >= 0) { return saved[m][n]; } var c = 0, last = Math.min(n, 9); for (var i = f; i <= last; ++i) { c += sumCount(0, m - 1, n - i, saved); } return saved[m][n] = c; } function calc(M, N) { var saved = []; var digs = Math.ceil(M / 2); for (var i = 0; i <= digs; ++i) { saved[i] = new Array(N + 1); for (var j = 0; j <= N; ++j) { saved[i][j] = -1; } } var count = sumCount(M % 2, digs, N, saved); var suf = Array(Math.ceil(M / 2)).join('0'); var k = M % 2 ? 1 : 9; return count ? (count * k) + suf : '0'; } return calc; }; document.getElementById("solution").onclick = function() { var M = parseInt(document.getElementById("id_m").value, 10); var N = parseInt(document.getElementById("id_n").value, 10); document.getElementById("solve").innerHTML = calculation(M, N); } </script> </body> </html> |
Цитата:
Цитата:
|
Alexandroppolus,
тьфу ты... Спасибо большое!) |
Часовой пояс GMT +3, время: 05:27. |