Комбинация ряда чисел последовательно - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу найти комбинацию для диапазона чисел последовательно. Предположим, у меня есть диапазон чисел от 1 до 5, тогда мой список комбинаций будет выглядеть как {1} {2} {3} {4} {5} {1,2} {1,2,3} {1,2,3,4} {1,2,3,4,5} {2,3} {2,3,4} {2,3,4,5} {3,4} {3,4,5}{4,5}.

Тем не менее, мой список не должен включать такие комбинации, как {1,3,4,5} {1,5} {2,5} и т. Д. В каждом наборе должны быть номера. последовательно.

Я попробовал это, добавив в список левую панель. В этом случае также учитывается непоследовательный набор.

        double count = Math.Pow(2, list.Count);
        for (int i = 1; i <= count - 1; i++)
        {
            string str = Convert.ToString(i, 2).PadLeft(list.Count, '0');

            for (int j = 0; j < str.Length; j++)
            {


                if (str[j] == '1')
                {
                    Console.Write(list[j]);

                }
            }
            Console.WriteLine();
        }

1 Ответ

0 голосов
/ 09 ноября 2019

Вот простой способ:

for (int i = 0; i < range.Length; i++)
{
    for (int j = i+1; j <= range.Length; j++)
    {
        Console.WriteLine(string.Join(",", range[i..j]));
    }
}

Если вы не используете C # 8 (и поэтому не можете использовать диапазоны), тогда вы можете использовать Skip() и Take():

for (int i = 0; i < range.Length; i++)
{
    for (int j = i+1; j <= range.Length; j++)
    {
        Console.WriteLine(string.Join(",", range.Skip(i).Take(j-i)));
    }
}

Обратите внимание, что это печатает {1}, {1,2}, {1,2,3}, {1,2,3,4}, {1,2,3,4,5}, {2} и т. Д. Вместо {1}, {2}, {3}, {4}, {5}, {1,2} и т. Д. Если это важно, вы можете настроить его следующим образом:

foreach (var item in range)
{
    Console.WriteLine(item);    
}

for (int i = 0; i < range.Length; i++)
{
    for (int j = i+2; j <= range.Length; j++)
    {
        Console.WriteLine(string.Join(",", range.Skip(i).Take(j-i)));
    }
}
...