找到可以用1和0编写的数字的多个

时间:2011-10-24 21:25:35

标签: java algorithm

给定数字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。 谢谢你的帮助!

3 个答案:

答案 0 :(得分:5)

您可以使用breadth first search。首先考虑1,因为您的号码必须以1开头,然后每次从队列中提取一个号码x,看看它是n的倍数还是不。如果是,您有答案,如果没有在队列中插入x * 10x * 10 + 1(按此顺序)。

请注意,您实际上不必将10的整个字符串存储在队列中:它足以存储除n之后的剩余部分和一些辅助部分允许您重建实际字符串的信息。如果您需要更多详细信息,请回写。

答案 1 :(得分:0)

非暴力方法是迭代仅包含0和1的一系列数字,然后计算出该数字是否是所讨论数字的倍数。这种方法比迭代n的倍数并确定它是否仅包含01要高效得多。

IVlad's suggestion是制作该系列的更有效方式(仅包含01的数字)。但是,如果您希望即时生成数字(没有队列的内存开销),您可以简单地遍历整数(或使用循环索引),并且对于每个值,将其二进制表示解释为十进制数。 / 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;
        }
    }
}