有人可以找到十进制二进制的解决方案吗(十进制数字包含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的重复项,我的问题不是子集问题,并且是该问题的完全不同的形式
答案 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;
}
}