给定参数n 从1到n会有n个整数 1,2,3,...n
这n个数字共有n!种排列 按大小顺序升序列出所有排列情况
并一一标记
当n=3时,所有排列如下
"123","132","213","231","312","321"
给定n和k 返回第n个排列
输入描述
第一行为n
第二行为k
n的范围是 1~9
k的范围是 1~n!
输出描述
输出排列第k位置的数字
示例一:
输入
3
3
输出
213
示例二:
输入
2
2
输出
21
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int n = 0;
int mm = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m) {
n++;
if (n == mm) {
for(i = 0; i <= m; i++)
printf("%d", list[i]);
printf("\n");
}
} else {
for(i = k; i <= m; i++) {
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;//输入自然数的个数
printf("input:");
scanf("%d",&k);
scanf("%d",&mm);
int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++) {
list[i] = i + 1;
}
perm(list, 0, k-1);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int n = 0;
int mm = 0;
char s[10000] = {0};
char str[1000] = {0};
void swap(char *a, char *b)
{
char m;
m = *a;
*a = *b;
*b = m;
}
void perm(char *list, int k, int m)
{
int i;
if(k > m) {
n++;
printf("%s\n", list);
} else {
for(i = k; i <= m; i++) {
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;
gets(s);
gets(str);
k = strlen(str);
perm(str, 0, k - 1);
return 0;
}