Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 6

Найти наибольшую комбинацию числ

15.05.2018, 14:30. Показов 1118. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На вход дается массив случайных чисел случайной длины, вводимый пользователем. Необходимо из этих чисел составить наибольшую комбинацию и ввести пользователю. Например если вбиты числа 9, 93, 986, 50 на выходе будет 9.986.93.50. Пожалуйста, помогите решить эту задачу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.05.2018, 14:30
Ответы с готовыми решениями:

Дано четырехзначное числ. Вывести наибольшую цифру на экран
Помогите пожалуйста. Дано четырехзначное число. Вывести наибольшую цифру на экран. Напишите функцию сравнения двух чисел.

имея 2 числа int N,M найти макс. делитель этих числ
я новенький в java и хочу удивить решение етой задачи условие: имея 2 числа int N=15,M=45 найти макс. делитель этих числ заранее...

Найти линейную комбинацию трёх векторов
83. Даны три трехмерных вектора a, b и c, заданные своими координатами , вещественное число k. Найти вектор, равный ka + (1-k)b + k2c....

5
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
15.05.2018, 14:51
расшифруйте понятие "наибольшая"
почему наибольшей вы указали 9.986.93.50., а не 986.93.50.9. и не 93.986.50.9.?

и что именно, и куда надо ввести пользователю?
0
0 / 0 / 0
Регистрация: 26.02.2018
Сообщений: 6
15.05.2018, 15:13  [ТС]
Извините, опечатался. Число, которое образуется последовательностью 9.986.93.50 (число 99869350), больше других чисел, образованных другими комбинациями. Вывести пользователю нужно наибольшее получившееся число.

На вход пользователь дает числа которые сам пожелает. Ограничений по количеству чисел или размеру нет.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
15.05.2018, 16:13
Цитата Сообщение от zlaskus Посмотреть сообщение
Ограничений по количеству чисел или размеру нет
таки и нет?
1. про максимальное числовое значение, представимое в JavaScript Number.MAX_VALUE ничего не слышали?
почитайте на досуге

спич не только о тех числах, что введёт пользователь, а и о тех, что могут получиться конкатенацией из введённых

2. надеюсь, понимаете, что задача решается комбинаторным методом перестановки введённых пользователем чисел, а число перестановок вычисляется как факториал количества этих чисел.
уверяю: браузер подвиснет даже при десяти введённых пользователем числах
для справки: 10! = 3 628 800
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
16.05.2018, 13:29
Кликните здесь для просмотра всего текста
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
let numbers = [9, 93, 986, 50]
numbers = numbers.map(n => n.toString()).sort().reverse()
 
let tree = {
    value: null,
    fullValue: null,
    token: false,
    leaves: []
};
 
function putNumberIntoTree(tree, number, prefix = '') {
    let size = number.length
    let ch = number.charAt(0)
    let found = false
 
    for (var leave of tree.leaves) {
        if (leave.value === ch) {
            found = true
            leave.token = size === 1
            break
        }
    }
 
    if (found === false) {
        leave = {
            value: ch,
            fullValue: prefix + ch,
            token: size === 1,
            leaves: []
        }
        tree.leaves.push(leave)
    }
 
    if (size === 1) {
        return
    }
 
    putNumberIntoTree(leave, number.substr(1), prefix + ch)
}
 
for (let num of numbers) {
    putNumberIntoTree(tree, num)
}
 
let result = []
function findMaxConcat(tree) {
    let tmp = ''
    if (tree.token === true) {
        tmp = tree.fullValue
    }
 
    let processed = false
    for (let leave of tree.leaves) {
        if (tmp !== '' && processed === false && leave.value <= tree.value) {
            result.push(tmp)
            processed = true
        }
        findMaxConcat(leave)
    }
 
    if (tmp !== '' && processed === false) {
        result.push(tmp)
    }
}
 
findMaxConcat(tree)
console.log(result.join('.'))
Добавлено через 7 часов 22 минуты

Исправленный вариант
Кликните здесь для просмотра всего текста
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
let numbers = [9, 93, 986, 50, 9869, 98699, 98698, 99]
numbers = numbers.map(n => n.toString()).sort().reverse()
 
let tree = {
    value: null,
    fullValue: null,
    token: false,
    leaves: []
};
 
function putNumberIntoTree(tree, number, prefix = '') {
    let size = number.length
    let ch = number.charAt(0)
    let found = false
 
    for (var leaf of tree.leaves) {
        if (leaf.value === ch) {
            found = true
            leaf.token = leaf.token || size === 1
            break
        }
    }
 
    if (found === false) {
        leaf = {
            value: ch,
            fullValue: prefix + ch,
            token: size === 1,
            leaves: []
        }
        tree.leaves.push(leaf)
    }
 
    if (size === 1) {
        return
    }
 
    putNumberIntoTree(leaf, number.substr(1), prefix + ch)
}
 
for (let num of numbers) {
    putNumberIntoTree(tree, num)
}
 
let result = []
function findMaxConcat(tree) {
    let tmp = ''
    if (tree.token === true) {
        tmp = tree.fullValue
    }
 
    let processed = false
    for (let leaf of tree.leaves) {
        if (tmp !== '' && processed === false && leaf.value < tree.value) {
            result.push(tmp)
            processed = true
        }
        findMaxConcat(leaf)
    }
 
    if (tmp !== '' && processed === false) {
        result.push(tmp)
    }
}
 
findMaxConcat(tree)
console.log(result.join('.'))


Добавлено через 14 минут
хотя тогда на [9, 93, 993] сломается

Добавлено через 3 часа 40 минут
И надеюсь что уже точно рабочий вариант
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
let numbers = [9, 93, 993, 986, 50, 9869, 98699, 98698, 99, 989]
numbers = numbers.map(n => n.toString()).sort().reverse()
 
let tree = {
    value: null,
    token: null,
    leaves: []
};
 
function putNumberIntoTree(tree, number, prefix = '') {
    let size = number.length
    let ch = number.charAt(0)
    let found = false
 
    for (var leaf of tree.leaves) {
        if (leaf.value === ch) {
            found = true
            leaf.token = size === 1 ? prefix + ch : null
            break
        }
    }
 
    if (!found) {
        leaf = {
            value: ch,
            token: size === 1 ? prefix + ch : null,
            leaves: []
        }
        tree.leaves.push(leaf)
    }
 
    if (size === 1) {
        return
    }
 
    putNumberIntoTree(leaf, number.substr(1), prefix + ch)
}
 
for (let num of numbers) {
    putNumberIntoTree(tree, num)
}
 
Array.prototype.top = function() {
    return this.length === 0 ? -1 : this[this.length - 1]
}
 
let result = []
let stack = []
function findMaxConcat(tree) {
    while (stack.top().value > tree.value) {
        result.push(stack.pop().token)
    }
 
    if (tree.token !== null) {
        if (tree.leaves.length === 0) {
            result.push(tree.token)
        } else {
            stack.push(tree)
        }
    }
 
    for (let leaf of tree.leaves) {
        findMaxConcat(leaf)
    }
 
    if (stack.top() === tree) {
        result.push(stack.pop().token)
    }
}
 
findMaxConcat(tree)
console.log(result.join('.'))
2
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
16.05.2018, 15:12
Если бы числа были одинаковой длины, то входной массив сортируется в обратном порядке. Тут всё просто.
JavaScript
1
2
3
function compare (a, b) {
  return b - a;
}
Значит нам надо придумать хитрую функцию сравнивания чисел, в которой, к примеру (меньшее ставится вперед):
  • 3 > 43 => 433 > 343
  • 3 < 23 => 323 > 233
  • 3 == 33 => 333 == 333
  • 4242 == 424242 => 42 424 242 == 42 424 242
  • 4242 < 4242399 => 42 424 242 399 > 42 423 994 242
  • 423 > 4234392 => 4 234 392 423 > 4 234 234 392

Не ищем лёгких путей - не будем приводить числа к строке и пользоваться строковыми функциями.

Надо научиться считать цифры в числах:
JavaScript
1
2
3
4
5
6
7
8
9
10
var app = {};
 
app.digits = function digits (n) {
  var count = 1;
 
  n = n / 10;
  if (n >= 1) count += digits(n);
 
  return count;
}
Так как числа разной длины, можно сравнивать "кусочками" длинной короткого числа. Для этого надо брать первые n чисел длинного числа, заодно пусть возвращает и остаток:
JavaScript
1
2
3
4
5
6
7
8
9
app.firstDigits = function (n, count) {
  var digits = app.digits(n),
    divider = Math.pow(10, digits - count);
 
  return [
    Math.floor(n / divider),
    n % divider
  ]
}
Функция, которая из двух чисел возвращает числа одинаковой длины и "хвостик" длинного числа
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
app.normalizeLength = function (a, b) {
  var al = app.digits(a),
    bl = app.digits(b),
    numbers;
 
  if (al > bl) {
    numbers = app.firstDigits(a, bl);
    return [numbers[0], b, numbers[1]]
  } else {
    numbers = app.firstDigits(b, al);
    return [a, numbers[0], numbers[1]]
  }
}
Функция "сравниватель". Если числа a и b одинаковой длины возвращаем b - a, иначе от "длинного" числа берем часть равную длине "короткого" и сравниваем их, если и тут числа одинаковы, то сравниваем остаток длинного с коротким и т. д.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
app.compare = function compare (a, b) {
  var al = app.digits(a),
    bl = app.digits(b);
 
  if (al === bl) {
    return b - a;
  } else {
    var numbers = app.normalizeLength(a, b),
      result = numbers[1] - numbers[0];
 
    if (result !== 0) return result;
 
    return compare(al < bl ? a : numbers[2], al < bl ? numbers[2] : b) // looks cryptic :/
  }
}
Осталось подсунуть в сортировку
JavaScript
1
2
3
app.maxNumber = function (arr) {
  return arr.slice().sort(app.compare);
}
HTML5
1
2
3
4
5
6
<form id="test-form">
  <label for="user-input">Введите числа, разделенные пробелом</label>
  <input name="userInput" id="user-input" type="text">
  <input type="submit">
  <output name="result"></output>
</form>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
window.addEventListener('DOMContentLoaded', function() {
  document.querySelector('form#test-form').addEventListener('submit', function(e) {
    e.preventDefault();
 
    var p = document.createElement('p'),
      arr = this.userInput.value.split(' ').map(function(v) {
        return parseInt(v, 10);
      });
 
    p.textContent = app.maxNumber(arr).join('.');
    this.reset();
    this.result.appendChild(p);
  });
});
https://jsfiddle.net/j2FunOnly/4rjgy3zn/

Добавлено через 1 час 27 минут
Цитата Сообщение от Jewbacabra Посмотреть сообщение
И надеюсь что уже точно рабочий вариант
JavaScript
1
2
3
4
let numbers = [423, 4234392];
...
findMaxConcat(tree)
console.log(result.join('.')) //=> 423.4234392 < 4234392.423
JavaScript
1
2
3
4
let numbers = [33, 333, 33, 3];
...
findMaxConcat(tree)
console.log(result.join('.')) //=> 333.33.3 < 33.333.33.3
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.05.2018, 15:12
Помогаю со студенческими работами здесь

Найти нетривиальную линейную комбинацию векторов
Найти нетривиальную линейную комбинацию векторов a1(-1;4;-2-1-5), a2(3;9;-1;10;1), a3(2;7;-1;7;0)

Подскажите, не могу нигде найти информацию об числ интегрировании формулой Радо
Нужна квадратурная формула Радо...Верней сама формула извесна, но не известно, как находить коэффициенты в сумме.. Весь интернет перерыл...

Найти длину вектора и напечатать комбинацию из них
Private A(2, 2), B(3, 3), C(2, 2), h(3, 3), x(3), i, j, s, s1, s2, s3, dl As Variant Sub задача4() Worksheets(1).Select Cells.Clear ...

Не удается найти комбинацию фильтров для просмотра потока в KMPlayer
Записала клипы на dvd диск, хочу проверить как записалось, а KMPlayer мне выдаёт &quot;не удается найти комбинацию фильтров для просмотра...

Найти комбинацию из 5-ти цифр в одной ячейке и сделать гиперссылку по этому значению в другой
Добрый день! Помогите, пожалуйста, с кодом. Есть таблица в Excel'е, нужно написать макрос, который будет искать в текущей ячейке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru