查找给定输入的十进制二进制

时间:2019-04-30 06:46:31

标签: java

有人可以找到十进制二进制的解决方案吗(十进制数字包含0和1,例如100111101等。而数字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

我尝试过,无法解决。

编辑:这不是Finding shortest combinations in array/sequence that equals sum的重复项,我的问题不是子集问题,并且是该问题的完全不同的形式

2 个答案:

答案 0 :(得分:3)

另一种方法,方法稍有不同

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

答案 1 :(得分:2)

这里的逻辑似乎是将一堆书面的binaray数字(由1或0组成)添加为十进制数字,直到总和得出所请求的数字为止。

所以您要做的就是找到最大可能的“ deci-binary ”并执行 只要您有总和。

要打印或查找最大十进制数,您将需要当前十进制的“长度”,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;
    }
}