我在接受采访时被问到以下问题,我不知道该怎么做
编写程序以找到可由0和9形成的最小数字,该数字可被给定数字整除 . 例如,如果给定的数字是3输出应该是9,如果给定数字是2输出是90,如果给定数字是10输出是90
我在网上找到了这个解决方案,但我还没有理解这一点: -
public class Smallest0And9DivisibleNumber {
public static int find(int divisible) {
int bin = 1;
while (true) {
int res = translate(bin);
if (res % divisible == 0) {
return res;
}
bin += 1;
}
}
private static int translate(int bin) {
int result = 0;
for (int i = Integer.toBinaryString(bin).length(); i > 0; i--) {
result *= result != 0 ? 10 : 0;
int mask = 1 << (i - 1);
result += (bin & mask) == mask ? 9 : 0;
}
return result;
}
public static void main(String[] args) {
assert find(10) == 90;
assert find(99) == 99;
assert find(33) == 99;
assert find(3) == 9;
assert find(333) == 999;
assert find(300) == 900;
assert find(303) == 909;
assert find(3033) == 9099;
assert find(3303) == 9909;
}
}
任何人都可以帮助您提供良好的理解或替代解决方案吗?
2 回答
这是一种类似的方法 .
我们如何手动执行33:
让我们来看看模式 .
它看起来怎样?二进制!是的,而不是1我们有9 .
现在我将从0开始直到我得到一个以二进制形式划分它的数字(通过用9替换1) .
我们得到
我们得到了所有可以在_2525309中使用0和9形成的数字 .
我想,翻译方法是需要更多澄清的方法 . 简单地说,它生成由“0”和“9”而不是“0”和“1”组成的“bin”号的二进制表示 . 虽然“查找”方法从1开始并检查“translate”生成的数字是否可被“可分”整除