Может ли кто-нибудь найти решение для нахождения деци-двоичного (десятичные числа содержат 0 и 1, например 100 111 101 и т. д., а числа, такие как 12, 13 и 5551, не являются десятизначными)
Числа, используемые здесь, являются десятичными, только ничего не в двоичном формате.
Вывод не в двоичном формате. Сумма всех чисел на выходе должна быть такой же, как и на входе. Например, ниже ввод представляет собой десятичное число 4, а вывод представляет собой десятичные числа 1,1,1 и 1. При добавлении всего вывода мы можем получить ввод.
Если вход равен 11, то это десятичный двоичный код, поэтому мы не хотим его преобразовывать. поэтому вывод будет таким же, как ввод 11.
Для ввода 4
Вывод должен быть 1 1 1 1
Другие сценарии, как показано ниже
IP: 4
OP: 1 1 1 1
IP: 21
OP: 10 11
IP: 11
OP: 11
IP: 100
OP: 100
IP: 99
OP: 11 11 11 11 11 11 11 11 11
Пробовал, не смог решить.
Обновлено: это не дубликат Поиск кратчайших комбинаций в массиве/последовательности, равной сумме, мой вопрос не является проблемой подмножества и полностью отличается от этого вопроса.
Пожалуйста, поделитесь фрагментом кода.
Почему 99 -> 11 11 11 11 11 11 11 11 11? пожалуйста, объясни
Вы можете проверить эту ссылку: geeksforgeeks.org/java-program-for-decimal-to-binary-conversion
Кажется, существуют различные определения слова «децибинарный». Что у тебя?
Если вы намерены преобразовать десятичные входные данные в двоичные выходные, то ваши тестовые данные ошибочны, т. Е. Число 4 равно 100 в десятичном виде. Поэтому, пожалуйста, уточните свой вопрос или проверьте свои тестовые данные.
@ernest_k, Lino и Bewu, пожалуйста, обратитесь к обновленному вопросу.
Для уточнения: ввод должен быть разделен на группы десятичных знаков, которые состоят только из 1 и 0, верно ли это предположение? Как следует обрабатывать несколько возможных решений? т.е. ввод 97 будет действителен как 11 11 11 11 11 11 11 10 10 и 11 11 11 11 11 11 11 11 1 1 1 1 1 1 1 1 1 и многие другие комбинации 1, 10 и 11. Также рассмотрите возможность добавления определения децибинарных чисел по мере необходимости (как предложил Клитос), потому что этот термин неоднозначен.
@BeWu Да, правильно. Ответ должен быть минимальным количеством разделений. Первый в вашем примере правильный. Я познакомился с этим термином в интервью. Так что я написал это, как я слышал. Извините, если что-то не так.
С учетом минимального количества разделений задача может быть сведена к Min-Coin_Change-Problem ("алгоритмист.com/index.php/Min-Coin_Change"). См. stackoverflow.com/questions/9964289/… С "монетами" [1,10,11,100,101,110,111,1000,1001,1010,1011,1100,...]" Подход требует построить список «монет» до значения и передать его в алгоритм.
Возможный дубликат Поиск кратчайших комбинаций в массиве/последовательности, равной сумме




Кажется, что логика здесь состоит в том, что набор записанных бинарных чисел (состоящих из 1 или 0) добавляется в виде десятичных чисел до тех пор, пока сумма не приведет к запрошенному числу.
Так что все, что вам нужно сделать, это найти максимально возможное "децидвоичный" и сделать это до тех пор, пока у вас есть ваша сумма.
Для печати или нахождения максимального десятичного числа вам понадобится «длина» текущего десятичного числа, log10 поможет.
Java-код:
package de.test.lang.stackexchange;
import java.util.Collection;
import org.apache.commons.lang.StringUtils;
public class DeciBins {
public static void main(String[] args) {
printDeciBin(1);
printDeciBin(4);
printDeciBin(10);
printDeciBin(11);
printDeciBin(19);
printDeciBin(21);
printDeciBin(99);
printDeciBin(100);
}
@SuppressWarnings("UseOfSystemOutOrSystemErr")
public static void printDeciBin(int number) {
System.out.println(String.format("%d -> %s", number, StringUtils.join(findDeciBins(number), " ")));
}
// finds the array of deciBins by determining the maximum possible
// deciBin and subtract it, until 0.
static Collection<Integer> findDeciBins(int number) {
Collection<Integer> decis = new java.util.ArrayList<>();
int deciBin = number;
while (deciBin > 0) {
int y = find_maximum_decibinary(deciBin); // (e.g. for 99 => 11)
deciBin -= y;
decis.add(y);
}
return decis;
}
// finds the maximum decibin by determining the max length and substract 1
// until the val is smaller or equal the requested value x.
static int find_maximum_decibinary(int x) {
int l = (int) Math.ceil(Math.log10(x + 1));
int currMax = (1 << l) - 1;
while (currMax > 0) {
int curVal = Integer.parseInt(Integer.toBinaryString(currMax));
if (curVal <= x) {
return curVal;
}
currMax--;
}
return 1;
}
}
Почему 21 -> 10 11? Разве не должно быть 11 10 тогда?
Действительный аргумент. Не знаю, может быть, после этого можно отсортировать массив децибинариев.
Или, возможно, просто перевернуть список. В любом случае это неправильный ответ, пока автор не объяснит, чего он хочет достичь.
Заказ @talex не имеет значения. Выход в порядке.
Другое решение с немного другим подходом
public static void main(String[] args) {
printDeciBin(1);
printDeciBin(4);
printDeciBin(10);
printDeciBin(11);
printDeciBin(19);
printDeciBin(21);
printDeciBin(99);
printDeciBin(100);
}
public static void printDeciBin(int number) {
System.out.println(String.format("%d -> %s", number, findDeciBins(number).stream()
.map(Object::toString)
.collect(Collectors.joining(" "))));
}
static Collection<Integer> findDeciBins(int number) {
List<Integer> l = new ArrayList<>();
while (number != 0) {
l.add(number % 10);
number /= 10;
}
Collections.reverse(l);
List<Integer> result = new ArrayList<>();
while (true) {
boolean stop = true;
int curr = 0;
for (int i = 0; i < l.size(); i++) {
curr *= 10;
if (l.get(i) != 0) {
curr++;
l.set(i, l.get(i) - 1);
stop = false;
}
}
if (stop){
break;
}
result.add(curr);
}
return result;
}
Какая здесь логика? А можете поделиться, что пробовали?