列出所有数字排列,而无需用C语言重复

时间:2019-01-09 07:15:47

标签: c permutation

所以我有一个用C语言编写的作业问题,我在过去5个小时中一直在努力,但无法弄清楚出了什么问题。

问题陈述:

将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;
}

我得到的数字预期达到3。 但是从4开始,它并没有显示出所有的数字排列。

No of digits? : 4

2134
2314
2341
3241
3421
3412
4312
4132
4123
1423
1243
1234

在设置计数器直到 n!数组将不在索引范围内。

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

1 个答案:

答案 0 :(得分:1)

  

我想念什么?

对n个元素进行排序的可能性为$cut = 3; $text = explode('.', 'no.this.is.just.example'); echo implode('.', array_slice($text, 0, $cut)); // outputs no.this.is ,您的两个紧密的 for 无法为任何 n 值计算factorial(n),因此它们找不到所有订单。


可能的解决方案是:

factorial(n)

2:

#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:

12
21

4:

123
132
213
231
312
321