Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Алгоритм для создания суммы чисел. (https://javascript.ru/forum/misc/62254-algoritm-dlya-sozdaniya-summy-chisel.html)

Viral 01.04.2016 13:36

Алгоритм для создания суммы чисел.
 
День добрый, форумчане!
Передо мной стоит такая задача:
Есть некое число X (int).
X>=1 && X<=9;
Необходимо вывести все варианты групп чисел, удовлетворяющих тому же промежутку и типу, что и Х, которые в сумме дадут X.

Например, если X == 5, а выводить будем массивами, то функция должна вернуть примерно следующее:

arr = 
	[ 
		[5], 
		[1,4], 
		[4,1], 
		[2,3], 
		[3,2], 
		[1,1,3], 
		[1,3,1], 
		[3,1,1], 
		[1,2,2], 
		[2,1,2], 
		[2,2,1], 
		[1,1,1,2], 
		[1,1,2,1], 
		[1,2,1,1], 
		[2,1,1,1], 
		[1,1,1,1,1] 
	]


Собственно, код не интересует, есть у кого-то идеи относительно алгоритма реализации подобного? Или предположение о том, как правильно спросить у гугла?)

destus 01.04.2016 13:43

Viral,
https://www.quora.com/Algorithm-to-s...riginal-number

рони 01.04.2016 14:51

:blink: Дежавю

destus 01.04.2016 14:53

рони,
ага :)

Viral 01.04.2016 14:55

рони,
уже было?

рони 01.04.2016 15:10

Viral,
http://javascript.ru/forum/misc/6192...tml#post411108

<script>
function fn(b, d) {
    for (var a = Array(b + 1).join("1").split(""), c = []; a[0] != b;) a.reduce(function(a, b) {
        return +a + +b
    }, 0) < b ? a.push(1) : (a.every(function(a) {
        return +a <= d
    }) && c.push(a.slice()), a.pop(), a[a.length - 1]++);  console.log(c)
    c.push([b])
    return c.sort(function(a, b) {
        return +a.join('') - +b.join('')
    })
};
document.write(fn(5,5).join('<br>')+ "<br>Всего: "+ fn(5,5).length);

</script>

осторожно в массиве есть не цифры а строки , если нужны именно цифры заменить формирование первоначального массива,
Цитата:

Сообщение от Viral
X>=1 && X<=9;

для x в этих пределах это
просто :)

Viral 01.04.2016 15:14

рони,
Спасибо

рони 01.04.2016 15:17

Viral,
<script>
function fn(b, d) {
    for (var a = [1,1,1,1,1,1,1,1,1].slice(b), c = []; a[0] != b;) a.reduce(function(a, b) {
        return +a + +b
    }, 0) < b ? a.push(1) : (a.every(function(a) {
        return +a <= d
    }) && c.push(a.slice()), a.pop(), a[a.length - 1]++);
    c.push([b])
    return c.sort(function(a, b) {
        return +a.join('') - +b.join('')
    })
};
document.write(fn(5,5).join('<br>')+ "<br>Всего: "+ fn(5,5).length);

</script>


Часовой пояс GMT +3, время: 20:26.