怎样用C实现 输入N,输出1到N这N个自然数的全排列呢?

谢谢calling for SIMPLE ones!
2025-03-09 13:40:40
推荐回答(3个)
回答1:

#include ;
#include ;
#include ;
#include ;

FILE *fp;

void perm(char *, int, int);

int main(void) {
char str[256];
time_t t;

fp = fopen("./log.txt", "w");
if (fp == NULL){
printf("fopen error!\n");
exit(1);
}

printf("input a string smaller than 255:");
gets(str);

t = time(0);

perm(str, 0, strlen(str));

t = time(0) - t;

fprintf(fp, "kill time:%ldsec\n", t);

exit(0);
}

void perm(char *str, int pos, int len) {
char tmp;
int i;

if (pos < len-1) {
// recursion.
for (i = pos; i < len; i++) {
// change and recursion.
tmp = str[pos];
str[pos] = str[i];
str[i] = tmp;

perm(str, pos+1, len);

tmp = str[pos];
str[pos] = str[i];
str[i] = tmp;
}
}
else {
// end recursion.
fputs(str, fp);
fputc('\n', fp);
}

return;
}
char s[10], t[10];

void convert(char *strSource, char *strTarget, int nLen)
{
int i, j;
char strConvert[10];

if(nLen == 1) {
strTarget[0] = strSource[0];
printf("%s\n", t);
return;
}
else {
for(i=0; i for(j=0; j if(j == i) {
strTarget[0] = strSource[i];
memcpy(strConvert, strSource, i);
memcpy(strConvert+i, strSource+i+1, nLen-i-1);
convert(strConvert, strTarget+1, nLen-1);
}
}
}
}

main()
{
int n;

scanf("%d", &n);
sprintf(s, "%d", n);

memset(t, 0, 10);
convert(s, t, strlen(s));
}
#include ;
using namespace std;
#include ;
#include ;

template ;
void PRINT_ELEMENTS(const T&col1,const char*optsctr="")
{
typename T::const_iterator pos;
cout << optsctr;
for (pos = col1.begin(); pos !=col1.end(); ++pos)
cout << *pos << " ";
cout << endl;
}

int main()
{
vector; col1;
col1.push_back(1);
col1.push_back(2);
col1.push_back(2);
col1.push_back(4);
PRINT_ELEMENTS(col1,"on entry: ");

while (next_permutation(col1.begin(),col1.end()))
{
PRINT_ELEMENTS(col1," ");
}

cin.get();
}

回答2:

#include
inline void Swap(char& a, char& b)
{// 交换a和b
char temp = a;
a = b;
b = temp;
}

void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++) {
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list [k], list [i]);
}
}

int main()
{
char s[]="123";
Perm(s, 0, 2);
return 0;
}

回答3:

#include
#include
char string[9]="12345678";
int used[9]={0};
char output[9];
int length;
void F(int d)
{
int i;
for(i=0;i<=length;i++)
{
if(!used[i])
{
used[i]=1;
output[d]=string[i];
if(d==length)
{
for(d=0;dprintf("%c ",output[d]);
printf("%c\n",output[length]);
}
else
F(d+1);
used[i]=0;
}
}
}
int main(void)
{
int n;
scanf("%d",&n);
string[n]=0;
length=strlen(string)-1;
F(0);
return 0;
}