Нахождение Deci-Binary для заданного ввода

Может ли кто-нибудь найти решение для нахождения деци-двоичного (десятичные числа содержат 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

Пробовал, не смог решить.

Обновлено: это не дубликат Поиск кратчайших комбинаций в массиве/последовательности, равной сумме, мой вопрос не является проблемой подмножества и полностью отличается от этого вопроса.

Какая здесь логика? А можете поделиться, что пробовали?

ernest_k 30.04.2019 08:48

Пожалуйста, поделитесь фрагментом кода.

Pawan Tiwari 30.04.2019 08:48

Почему 99 -> 11 11 11 11 11 11 11 11 11? пожалуйста, объясни

Lino 30.04.2019 08:49

Вы можете проверить эту ссылку: geeksforgeeks.org/java-program-for-decimal-to-binary-convers‌​ion

Pawan Tiwari 30.04.2019 08:52

Кажется, существуют различные определения слова «децибинарный». Что у тебя?

Klitos Kyriacou 30.04.2019 09:07

Если вы намерены преобразовать десятичные входные данные в двоичные выходные, то ваши тестовые данные ошибочны, т. Е. Число 4 равно 100 в десятичном виде. Поэтому, пожалуйста, уточните свой вопрос или проверьте свои тестовые данные.

BeWu 30.04.2019 09:12

@ernest_k, Lino и Bewu, пожалуйста, обратитесь к обновленному вопросу.

saravanakumar 30.04.2019 09:30

Для уточнения: ввод должен быть разделен на группы десятичных знаков, которые состоят только из 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 30.04.2019 11:09

@BeWu Да, правильно. Ответ должен быть минимальным количеством разделений. Первый в вашем примере правильный. Я познакомился с этим термином в интервью. Так что я написал это, как я слышал. Извините, если что-то не так.

saravanakumar 30.04.2019 11:45

С учетом минимального количества разделений задача может быть сведена к 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,...]" Подход требует построить список «монет» до значения и передать его в алгоритм.

SirFartALot 30.04.2019 12:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
601
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кажется, что логика здесь состоит в том, что набор записанных бинарных чисел (состоящих из 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 30.04.2019 08:57

Действительный аргумент. Не знаю, может быть, после этого можно отсортировать массив децибинариев.

SirFartALot 30.04.2019 09:01

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

talex 30.04.2019 09:18

Заказ @talex не имеет значения. Выход в порядке.

saravanakumar 30.04.2019 09:32
Ответ принят как подходящий

Другое решение с немного другим подходом

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;
}

Другие вопросы по теме