c语言,如何得到n个数的排列
给定N个数,得到给定条件的所有排列,比如N=9,(123456789)得到4和1互换后所有排列,例如423156789就是一个432156789也是一个·········...
给定N个数,得到给定条件的所有排列,
比如N=9,(123456789)得到4和1互换后所有排列,例如423156789就是一个432156789也是一个···········等等
将这些排列保存到一个二维数组中或者二维vector都可以
保存排列用用个整形的二维数组或者二维向量保存排列的每个数。不要用字符串表示 展开
比如N=9,(123456789)得到4和1互换后所有排列,例如423156789就是一个432156789也是一个···········等等
将这些排列保存到一个二维数组中或者二维vector都可以
保存排列用用个整形的二维数组或者二维向量保存排列的每个数。不要用字符串表示 展开
展开全部
#include<stdio.h>
bool isUse[100];
int order[100];
void change(int *a,int n,int num);
void main()
{
printf("输入长度n");
int n;
scanf("%d",&n);
int *a=new int [n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for ( i=0;i<100;i++)
{
isUse[i]=0;
}
change(a,n,1);
}
void change(int *a,int n,int num)
{
for (int i=0;i<n;i++)
{
if(isUse[i]==0)
{
isUse[i]=1;
order[num]=i;
if(n>num)
change(a,n,1+num);
else
{
for (int j=1;j<=n;j++)
{
printf("%d",a[order[j]]);
}
printf("\n");
}
isUse[i]=0;
}
}
}
这个只是找出一串数字中的所有的换位数。你可以将那些要变的放在数组里。但这个还有一个缺点,就是对于相同的数字来说不能分开。例如112345,112345前面的1认为是不同的。分给我吧,我可是特意写的哦。
bool isUse[100];
int order[100];
void change(int *a,int n,int num);
void main()
{
printf("输入长度n");
int n;
scanf("%d",&n);
int *a=new int [n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for ( i=0;i<100;i++)
{
isUse[i]=0;
}
change(a,n,1);
}
void change(int *a,int n,int num)
{
for (int i=0;i<n;i++)
{
if(isUse[i]==0)
{
isUse[i]=1;
order[num]=i;
if(n>num)
change(a,n,1+num);
else
{
for (int j=1;j<=n;j++)
{
printf("%d",a[order[j]]);
}
printf("\n");
}
isUse[i]=0;
}
}
}
这个只是找出一串数字中的所有的换位数。你可以将那些要变的放在数组里。但这个还有一个缺点,就是对于相同的数字来说不能分开。例如112345,112345前面的1认为是不同的。分给我吧,我可是特意写的哦。
2010-12-09
展开全部
#include <stdio.h>
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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
其实你可以直接调用库函数--next_permutation;
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,*a,i,num=0;
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
do
{
num++;
for(i=0;i<n;i++)
printf("%d",a[i]);
printf("\n");
}while(next_permutation(a,a+n));
printf("%d\n",num);
free(a);
return 0;
}
这是生成n个数的排列,并且从小到大输出。
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n,*a,i,num=0;
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
do
{
num++;
for(i=0;i<n;i++)
printf("%d",a[i]);
printf("\n");
}while(next_permutation(a,a+n));
printf("%d\n",num);
free(a);
return 0;
}
这是生成n个数的排列,并且从小到大输出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以用冒泡和递归法实现,今天用的手机,写不了,明天到了电脑上给你写一下
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询