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
繰り返し/重複した数字を異なるものとして扱いたい-一意の順列だけを生成したくない-むしろ、それらが繰り返されているかどうかに関係なく、すべての順列を生成します。