如何在C中生成一系列带有唯一数字的数字?

时间:2017-02-26 10:17:42

标签: c

我现在已经解决了这个问题一天了,感觉我无处可去。

我想做什么:

在1-9之间生成九位数的所有可能组合,但没有数字可以相同。换句话说,我的目标是准确生成362880(9!)个数字,每个数字彼此唯一,每个数字必须只包含每个数字中的一个。不应该有随机性。

我想要的是什么:

123456789
213796485

我想要的是什么:

111111111
113456789

我尝试过的事情:

我首先创建一个数组来存储数字。

float num[9];

使用我num[0]可以是9位数中的任何一位的原则,并且num[8]必须是剩余的数字,我尝试了嵌套循环。我会发布代码,但是没有必要指出它为什么不起作用,因为我已经知道了原因。但是,我不知道如何解决它。

for (int a = 1; a < 10; a++) {
    num[0] = a;
    for (int b = 1; b < 9; b++) {
        if (b != a)
            num[1] = b;

        // The code in between follows the same pattern
        for (int i = 1; i < 2; i++) {
            if (i != a && i != b && i != c && i != d && i != e && i != f && i != g && i != h) {
                num[8] = i;
            }
        }
    }
}

如您所见,最后一位数字始终为1,第二位数字永远不会为9,依此类推。

那么我有什么选择?我尝试制作它以便它总共循环9 ^ 9次,这将解决我提到的问题,但这当然效率太低(并且它也没有按预期工作)。

有什么想法吗?我觉得这应该是一件容易解决的事情,但我似乎无法绕过它。

1 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案,按字典顺序生成362880个排列:

#include <stdio.h>
#include <string.h>

void perm9(char *dest, int i) {
    if (i == 9) {
        printf("%.9s\n", dest);
    } else {
        for (char c = '1'; c <= '9'; c++) {
            if (memchr(dest, c, i) == NULL) {
                dest[i] = c;
                perm9(dest, i + 1);
            }
        }
    }
}

int main(void) {
    char dest[9];
    perm9(dest, 0);
    return 0;
}