给定数字n
(2 <= n <= 1000),找到最低的非零倍数,其仅用数字0和1写入基数10。示例:2 - &gt; 10,3-&gt; 111,4 - &gt; 100,7 - &gt; 1001,11 - &gt; 11,9-&gt; 111 111 111.
我的想法不太好: {/ * n | 2和n | 5 +“000”(显示最大值(2,5)) - &gt; n | 3 +“111”* /}
我认为,按照剩余的数字分组由数字n组成,格式为0/1。 谢谢你的帮助!
答案 0 :(得分:5)
您可以使用breadth first search。首先考虑1
,因为您的号码必须以1
开头,然后每次从队列中提取一个号码x
,看看它是n
的倍数还是不。如果是,您有答案,如果没有在队列中插入x * 10
和x * 10 + 1
(按此顺序)。
请注意,您实际上不必将1
和0
的整个字符串存储在队列中:它足以存储除n
之后的剩余部分和一些辅助部分允许您重建实际字符串的信息。如果您需要更多详细信息,请回写。
答案 1 :(得分:0)
非暴力方法是迭代仅包含0和1的一系列数字,然后计算出该数字是否是所讨论数字的倍数。这种方法比迭代n
的倍数并确定它是否仅包含0
和1
要高效得多。
IVlad's suggestion是制作该系列的更有效方式(仅包含0
和1
的数字)。但是,如果您希望即时生成数字(没有队列的内存开销),您可以简单地遍历整数(或使用循环索引),并且对于每个值,将其二进制表示解释为十进制数。 / p>
2 (Decimal) -> 10 (Binary) -> (interpret as decimal 10)
3 (Decimal) -> 11 (Binary) -> (interpret as decimal 11)
4 (Decimal) -> 100 (Binary) -> (interpret as decimal 100)
5 (Decimal) -> 101 (Binary) -> (interpret as decimal 101)
... and so on.
对于转换,我怀疑可以通过将调用链接到Integer.toBinaryString()
和String.parseInt()
来完成,但可能有更有效的方法来执行此操作。
这是一个可以帮助您入门的在线演示:http://jsfiddle.net/6j5De/4/
答案 2 :(得分:0)
public static int result(int num)
{
int i =2;
while(true)
{
int mult = Integer.parseInt(Integer.toString(i++,2));
if( mult % num == 0) //Check whether it is a multipler of given number or not ?
{
return mult;
}
}
}