如何增加二进制数,其中添加了额外的1或删除了1

时间:2017-09-28 02:21:43

标签: c# binary increment

因此,我正在为C#中的作业做一些事情,以便在每个组合中打印出人们的名字。例如,如果有5个人,我使用了5位二进制数,并在每次迭代后添加1。

<00> 00000打印没有名字 00001印第一名 00010印第二名 00011印有第一个和第二个名字

......等等。最终,我可以迭代并打印出每个名字的组合。

所以,我被要求只考虑如何在添加一个名称或减去一个名称的情况下才能这样做。如果我理解这一点,我需要能够系统地打印出每个组合,但下一个打印的组合只能有一个名称,而不是最后一个名称,或者比最后一个名称少一个名称。

我正在寻找一些帮助,找出一些合乎逻辑的方法。我从这里开始:

            00000   0 names
Add 1           00001   1 name
double, add 1   00011   2 names
subtract 1      00010   1 name
double, add 1   00101   2 names
subtract 1      00100   1 name

这里我没有看到一个逻辑模式,因为如果我再次加倍,我将错过00111例如所以这是不对的。无论如何,我现在卡住了。

我不需要任何代码,我可以自己写。我只是需要一个更好的逻辑的想法。我这里只选择二进制数法,因为这是我被要求思考的问题。任何想法都会很棒。谢谢

1 个答案:

答案 0 :(得分:0)

试试这个:

var found = new HashSet<string>();

IEnumerable<string> Mutate(string current)
{
    for (var i = 0; i < current.Length; i++)
    {
        var sb = new StringBuilder(current);
        sb[i] = sb[i] == '0' ? '1' : '0';
        var r = sb.ToString();
        if (!found.Contains(r))
        {
            found.Add(r);
            yield return r;
            foreach (var r2 in Mutate(r))
            {
                yield return r2;
            }
        }
    }
}

var results = Mutate("00000").ToArray();

输出:

10000 
00000 
01000 
11000 
11100 
01100 
00100 
10100 
10110 
00110 
01110 
11110 
11010 
01010 
00010 
10010 
10011 
00011 
01011 
11011 
11111 
01111 
00111 
10111 
10101 
00101 
01101 
11101 
11001 
01001 
00001 
10001