在C语言中列出所有不重复的数字排列

在C语言中列出所有不重复的数字排列,c,permutation,C,Permutation,所以我有一个C语言的作业问题,我在过去的5个小时里一直在研究这个问题,但是我不知道出了什么问题 问题陈述: #include<stdio.h> #include<string.h> #include<math.h> #define N 10 void print(int *num, int n) { int i; for ( i = 0 ; i < n ; i++){ printf("%d", num[i]);

所以我有一个C语言的作业问题,我在过去的5个小时里一直在研究这个问题,但是我不知道出了什么问题

问题陈述:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 10

void print(int *num, int n)
{
    int i;
    for ( i = 0 ; i < n ; i++){
        printf("%d", num[i]);
    }
    printf("\n");
}

int main()
{
    int num[N];
    int temp;
    int i, n, j,k;

    printf("\nNo of digits? : ");
    scanf("%d", &n);

    for(k=0; k<n; k++){
        num[k] = k + 1; 
    }

    for (j = 1; j <= n; j++) {
        for (i = 0; i < n-1; i++) {
            temp = num[i];
            num[i] = num[i+1];
            num[i+1] = temp;
            print(num, n);
        }
    }
    return 0;
}
取n为1到9的位数,打印所有可能的数字,不重复数字。例如,如果n=3,则数字为1、2、3,数字为123、132、231、213、321、312

输入:2输出:12,21

输入:3输出:123、132、231、213、321、312

这就是我到目前为止所做的:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 10

void print(int *num, int n)
{
    int i;
    for ( i = 0 ; i < n ; i++){
        printf("%d", num[i]);
    }
    printf("\n");
}

int main()
{
    int num[N];
    int temp;
    int i, n, j,k;

    printf("\nNo of digits? : ");
    scanf("%d", &n);

    for(k=0; k<n; k++){
        num[k] = k + 1; 
    }

    for (j = 1; j <= n; j++) {
        for (i = 0; i < n-1; i++) {
            temp = num[i];
            num[i] = num[i+1];
            num[i+1] = temp;
            print(num, n);
        }
    }
    return 0;
}
设置计数器直到n数组将超出索引范围

那么,如何正确计算所有排列

我错过了什么

排序n个元素的可能性数量是
factorial(n)
,您的两个叠瓦for无法计算n的任何值的
factorial(n)
,因此它们无法找到所有的顺序


一种可能的解决办法是:

#include <stdio.h>

/* current is the number under fabrication 
   max is the max number of digit and also the max digit to use
   n is the number of digits to add to current
   used[n] is 0 if the digit n is not yet used, else 1 */

void permut(unsigned current, unsigned max, unsigned n, int used[])
{
  if (n == 0)
    printf("%d\n", current);
  else {
    unsigned i;

    for (i = 1; i <= max; ++i) {
      if (!used[i]) {
        used[i] = 1;
        permut(current*10 + i, max, n - 1, used);
        used[i] = 0;
      }
    }
  }
}

int main()
{
  unsigned n;
  int used[10] = { 0 }; /* used[n] is 0 if the digit n is not yet used */

  printf("No of digits? : ");
  if ((scanf("%u", &n) != 1) || (n == 0) || (n > 9))
    return 0;

  permut(0, n, n, used);
  return 0;
}
对于3:

123
132
213
231
312
321
对于4:

1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321

忘了说我知道了。我会加上它。我的问题是如何更正?@user101我希望你能从我对事实的评论中自己找到答案,不管怎样,我用一个建议编辑了我的答案。你能解释这个排列函数吗?@user101我添加了一些注释来解释变量的作用,如果你仍然无法理解,请在调试器下执行它,算法很简单,因为您的程序没有创建您声明的输出。请永远不要通过排序等方式修改输出,而是向我们展示程序真正打印的内容。当然,也向我们展示了错误的输出。不仅是正确的情况。如果您对迭代解决方案感兴趣,回溯是一种方法:我不同意重复标记,这里的问题更简单,“按字典顺序打印所有排列”的解决方案更复杂,当前问题不能遵循
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321