我用 C 编写了一个基本的排列程序。用户输入一个数字,它会打印出该数字的所有排列。
基本上,这就是它的工作原理(主要算法是用于找到下一个更高排列的算法):
int currentPerm = toAscending(num);
int lastPerm = toDescending(num);
int counter = 1;
printf("%d", currentPerm);
while (currentPerm != lastPerm)
{
counter++;
currentPerm = nextHigherPerm(currentPerm);
printf("%d", currentPerm);
}
但是,当输入的数字包含重复的数字(重复)时,不会生成一些排列,因为它们是重复的。计数器显示的数字与预期的不同 - 它没有显示数字中位数的阶乘,而是显示了一个较小的数字,只有唯一的排列。
例如:
num = 1234567
counter = 5040 (!7 - all unique)
num = 1123456
counter = 2520
num = 1112345
counter = 840
我希望它把重复/重复的数字视为不同的数字——我不想只生成唯一的排列——而是生成所有的排列,不管它们是否重复和重复。