发现不重复的数字

时间:2014-08-21 18:16:24

标签: c algorithm

我真的不知道如何解释它,所以我会解释我的代码:

#include <stdio.h>

// factorial source : http://www.programmingsimplified.com/c-program-find-factorial
int factorial(int n)
{
  int c, fact = 1;

  for (c = 1; c <= n; c++)
    fact = fact * c;
  return fact;
}

int main() {
  int i,j,switch_flag;
  int digit_length = 3;
  int probability = factorial(digit_length);

  unsigned char *digit = malloc(digit_length);

  for (i=0 ; i<digit_length ; i++)
    digit[i] = i;

  // Print Digit
  for (i=0 ; i<digit_length ; i++)
    printf("[%d]",digit[i]);
  printf("\n");


  for (i=1 ; i<probability ; i++) {
    switch_flag = i%(digit_length-1);

    unsigned char temp = digit[switch_flag];
    digit[switch_flag] = digit[switch_flag+1];
    digit[switch_flag+1] = temp;

    // Print Digit
    for (j=0 ; j<digit_length ; j++)
        printf("[%d]",digit[j]);
    printf("\n");
  }

  return 0;
}

将digit_length设置为3时的输出:

[0][1][2]
[0][2][1]
[2][0][1]
[2][1][0]
[1][2][0]
[1][0][2]

将digit_length设置为4时的输出:

[0][1][2][3]
[0][2][1][3]
[0][2][3][1]
[2][0][3][1]
[2][3][0][1]
[2][3][1][0]
[3][2][1][0]
[3][1][2][0]
[3][1][0][2]
[1][3][0][2]
[1][0][3][2]
[1][0][2][3]
[0][1][2][3]
[0][2][1][3]
[0][2][3][1]
[2][0][3][1]
[2][3][0][1]
[2][3][1][0]
[3][2][1][0]
[3][1][2][0]
[3][1][0][2]
[1][3][0][2]
[1][0][3][2]
[1][0][2][3]

digit_length大于3时的结果与预期不符 我不知道我应该使用哪个关键字进行搜索,所以我在这里问 请帮帮我

编辑:
我在这里找到了答案:
http://www.geeksforgeeks.org/write-a-c-program-to-print-all-permutations-of-a-given-string/

1 个答案:

答案 0 :(得分:3)

我不想为你编写整个代码,但你最好的选择是以下递归方法。要生成集合S的所有排列:

  1. 迭代S
  2. 中的所有元素x
  3. 对于每一个,以递归方式生成S \ {x}的所有排列,并将x附加到它们的开头。
  4. 换句话说,{0,1,2,3}的排列是

    • 0,然后是{1,2,3}
    • 的每个排列
    • 1然后是{0,2,3}
    • 的每个排列
    • 2然后是{0,1,3}
    • 的每个排列
    • 3然后是{0,1,2}
    • 的每个排列