排列在C号(Permutation for numbers in C)

2019-09-27 08:04发布

我试图写一个C函数来列出一组数字的所有排列,五人一组,包括重复数:

15-11-49-43-5
2-30-34-6-11

因此,它是很容易编写一个函数来抓取设置了许多的所有排列它们扔出去,但映射到特定组的大小,我有点卡住..

Answer 1:

void visit(int *Value, int N, int k)
{
  static level = -1;
  level = level+1; Value[k] = level;

  if (level == N)
    print(Value, N);
  else
    for (int i = 0; i < N; i++)
      if (Value[i] == 0)
        visit(Value, N, i);

  level = level-1; Value[k] = 0;
}

欲了解更多信息,您可以访问http://www.bearcave.com/random_hacks/permute.html



Answer 2:

你想获得一个特定的排列,例如像

  • 排列1 == 1,1,1,1,1
  • 置换2 == 1,1,1,1,2
  • 置换49 == 1,1,1,1,49
  • 置换50 == 1,1,1,2,1
  • 置换42000000 == 8,14,49,35,42

转换所需号码(减1)立足49,并使用“数字”(加1)的结果。

42000000 - 1 = 41999999
41999999 = (7 * 49^4) + (13 * 49^3) + (48 * 49^2) + (34 * 49) + 41
result      8            14            49            35         42


Answer 3:

如果你知道如何寻找所有排列但并不是所有大小5的组合,然后随便找的所有排列:

INT A [49] = {0,0,...,0,1,1,1,1,1};

数组A中的每一个排列对应于含有组合数(i + 1),当且仅当A [1] == 1,对于每个i [0,49)。



Answer 4:

因为重复是允许的,并设置输出比输入更小的集合,它实际上不是你后一切是一个排列。

你只是在寻找一个简单的计数:

for (a[0] = 1; a[0] <= 49; a[0]++)
  for (a[1] = 1; a[1] <= 49; a[1]++)
    for (a[2] = 1; a[2] <= 49; a[2]++)
      for (a[3] = 1; a[3] <= 49; a[3]++)
        for (a[4] = 1; a[4] <= 49; a[4]++)
          printf("%d-%d-%d-%d-%d\n", a[0], a[1], a[2], a[3], a[4]);


Answer 5:

我将这个分裂成两个问题:1)找到所有组合你的尺寸NB的阵列的NCK)发现长度为k的数组的所有排列。 你说你已经知道怎么做的排列,让我们专注于组合:

void combinations(int *arr, int *comb, int n, int k, int kCurr)
{
    if(kCurr >= k)
    {
        permutations(comb, k);
        return;
    }
    int i;
    for(i=0; i<n; ++i)
    {
        comb[kCurr] = arr[i];
        combinations(arr+i, comb, n-i, k, kCurr+1);
    }
}

它会被称为是这样的:

int myArray[49] = {1, 2, ..., 49};
int myCombs[5];
combinations(myArray, myCombs, 49, 5, 0);

这个计算所有组合49C5通过建立数组myCombs ,当它充满它调用一个函数permutations 。 如果permutations正确实施,那么你将打印出来的49C5所有组合的所有排列。

编辑:咄,你可以做combinations(arr, comb, n, k kCurr+1)作为递归步骤,然后只在打印基础案例的阵列(或做任何)。



文章来源: Permutation for numbers in C