Математическая задачка на JS (часть кода внутри)
Привет всем, есть простая математическая задачка, пытаюсь ее написать на javascript. Суть задачи - получить 10-значное число, в котором
первая цифра соответствует количеству единиц в числе; вторая цифра - количеству двоек; третья цифра - количеству троек; ... десятая цифра - количеству нулей. получается вот такое число 2 1 0 0 0 1 0 0 0 6 как кодом его его получить? Кроме как написать каркас с рекурсией дальше у меня не идет, нужна помощь гуру)) let a = []; let b = []; function number(left, pos) { if (pos == 10) { if (left == 0) { b.splice(0, a.length) for (i = 0; i < 10; i++) { ++b[a[i]]; } // наверное дальше надо как то сравнить оба массива?? } } else { for (i = 0; i <= left; i++) { a[pos] = i; number(left - i, pos + 1); } } } number(10, 0); Заранее спасибо! |
Цитата:
|
рони,
именно получить, сгенерировать как бы. Задача вообще для 5-го класса, число получается вот такое 2 1 0 0 0 1 0 0 0 6 как мне казалось, надо как сдвигать нули в массиве, начиная с 10, записывая кол-во нулей в конец массива, но все пошло не так и уперся)) |
https://otvet.mail.ru/question/16330299
Здесь можно глянуть описание логики решения |
Цитата:
|
Vlasenko Fedor,
вот есть вопрос, челове пишет что "очевидно, что сумма цифр в числе равна 10", а откуда он это взял? если не знать ответа, разве как то можно это определить? На мой взгляд, из условия задачи мы понимаем только то, что 1) последняя цифра точно не ноль, так как он есть, 2) первая тоже не ноль, так как число с нуля не начинается. А от суммы 10 строится вся логика проверок. |
Цитата:
|
решал эту задачу давно, на бумаге.
стартовал от "первого приближения" 0000000009, потом за несколько итераций "улучшал" результат, исправляя косяки - 0000000108, 1000000108, 2100000108, ..., и быстро дошел до итогового. Но вот как это формализовать для программы, чтобы не зациклилось, сходу не очень понятно... |
Методом проб, ошибок и тыка
(но никак не научных размышлений) Составил такой алгоритм, который очень быстро получает это число let res = [0,0,0,0,0,0,0,0,0,0]; const count = (dig) => res.filter(v => v === dig).length; const test = () => { for (let i = 0; i<10; i++) { const dig = i < 9? i+1 : 0; if (count (dig) != res[i]) return false; } return true; } const change = () => { const newa = []; for (let i = 0; i<10; i++) { const dig = i < 9? i+1 : 0; const nd = count (dig) if (nd != res[i]) { res[i] = nd; } } } let n = 0; while (!test()) { change (); n++; console.log(n, [...res]); } console.log ('FINISH : ', n, res) Ничуть не претендую на красоту алгоритма и кода Но находит результат с любого начального значения (res) |
voraa,
Маэстро, снимаю шляпу! Спасибо! |
Часовой пояс GMT +3, время: 12:18. |