 
			
				12.05.2019, 21:14
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Alexandroppolus, 
почему при М = 6 у вас иной подсчёт, чем при М = 5? 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось рони, 12.05.2019 в 21:22.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				12.05.2019, 21:57
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Alexandroppolus
			
		
	 | 
 
	| 
		(предполагаем, что самый младший разряд - первый, т.е. нечетный):
	 | 
 
	
 
 
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));
10!!! а не 9 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось рони, 12.05.2019 в 22:04.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				12.05.2019, 22:04
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Alexandroppolus,
   не учёл что речь была о младшем разряде, считал первую цифру нечётной. 
вопрос исчерпан.   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				12.05.2019, 23:30
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.10.2016 
					
					
					
						Сообщений: 1,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		(1<N<90, 5<M<20) 
поскольку при этих ограничениях результат не всегда влезает в Number.MAX_SAFE_INTEGER, то возвращаем его в виде строки    
https://jsfiddle.net/bw783h4j/ 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Alexandroppolus, 12.05.2019 в 23:42.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				13.05.2019, 00:39
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Alexandroppolus, 
 ничего не понял, но спасибо!    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2019, 18:10
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.05.2019 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Alexandroppolus, 
 Спасибо большое за ваш труд!  
 Не могли бы вы еще раз попроще объяснить, что происходит в функции sumCount() ? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2019, 18:32
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.10.2016 
					
					
					
						Сообщений: 1,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 ProgYoung, 
функциия sumCount определяет, сколькими способами можно разложить число n на m слагаемых, так что каждое слагаемое будет в пределах от 0 до 9, а первое слагаемое - от f до 9. Она работает рекурсивно - в цикле перебирает все возможные значения первого слагаемого и на каждой итерации считает sumCount(m-1, n-i) - т.е. если первое число взять равным i, то сколько будет вариантов по остальным числам и оставшейся сумме. Это всё суммируется. 
 
Массив saved - для сохранения значений sumCount(m, n), т.к. они часто будут повторяться: например, если первые два слагаемых равны (1, 7), (2, 6) и  т.д., то оставшаяся сумма одинакова. 
 
т.е. sumCount как раз и делает подсчет вариантов для нечетных разрядов, коих оказалось примерно половина от всех разрядов числа. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2019, 18:57
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.05.2019 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		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>
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось ProgYoung, 14.05.2019 в 19:11.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				14.05.2019, 23:18
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.10.2016 
					
					
					
						Сообщений: 1,013
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ProgYoung
			
		
	 | 
 
	| 
		почему первое слагаемое от f, а не от 1?
	 | 
 
	
 
 f по факту может быть 0 или 1, функция вызывается так: sumCount(M % 2, digs, N, saved);
 
	
 
	| 
		
			Сообщение от ProgYoung
			
		
	 | 
 
	| 
		Еще у меня так и не выводит ответ, хотя вроде все правильно
	 | 
 
	
 
 id у элементов не совпадают с теми, которые в getElementById используются.  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Alexandroppolus, 14.05.2019 в 23:22.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				15.05.2019, 07:49
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 08.05.2019 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Alexandroppolus, 
 тьфу ты... Спасибо большое!) 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |