Ⅰ 求c语言全排列算法
这个说起来太麻烦了, 我找了一个, 你看看行不, 不可以的话, 私聊吧.
全排列用的是 置换算法,
算法这东西重在理解。具体代码并不那么重要。
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为
例说明如何编写全排列的递归算法。
1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。
由于一个数的全排列就是其本身,从而得到以上结果。
2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。
即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.
从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。
因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。
为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
算法如下:
#include <stdio.h>
int n = 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)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf("\n");
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 list[] = {1, 2, 3, 4, 5};
perm(list, 0, 4);
printf("total:%d\n", n);
return 0;
}
链接: http://..com/question/71586341.html?si=2
Ⅱ 一个C语言全排列的算法。 比如,输入3,则将123的全排列全部输出:123,132,213,231
#include
main()
{
int a1,a2,a3,a4,a5,a6,a7,a8,a9,n,t=0;
scanf("%d",&n);
for(a1=1;a1<=n;a1++)
if(n==1){printf("%d\n",a1);t=t+1;}
else
for (a2=1;a2<=n;a2++)
if(a2!=a1)
{if(n==2) {printf("%d%d\n",a1,a2);t=t+1;}
else
for (a3=1;a3<=n;a3++)
if(a3!=a2&&a3!=a1)
{if(n==3) {printf("%d%d%d\n",a1,a2,a3);t=t+1;}
else
for (a4=1;a4<=n;a4++)
if(a4!=a3&&a4!=a2&&a4!=a1)
{if(n==4) {printf("%d%d%d%d\n",a1,a2,a3,a4);t=t+1;}
else
for (a5=1;a5<=n;a5++)
if(a5!=a4&&a5!=a3&&a5!=a2&&a5!=a1)
{if(n==5) {printf("%d%d%d%d%d\n",a1,a2,a3,a4,a5);t=t+1;}
else
for (a6=1;a6<=n;a6++)
if(a6!=a5&&a6!=a4&&a6!=a3&&a6!=a2&&a6!=a1)
{if(n==6) {printf("%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6);t=t+1;}
else
for (a7=1;a7<=n;a7++)
if(a7!=a6&&a7!=a5&&a7!=a4&&a7!=a3&&a7!=a2&&a7!=a1)
{if(n==7) {printf("%d%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6,a7);t=t+1;}
else
for (a8=1;a8<=n;a8++)
if(a8!=a7&&a8!=a6&&a8!=a5&&a8!=a4&&a8!=a3&&a8!=a2&&a8!=a1)
{if(n==8) {printf("%d%d%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6,a7,a8);t=t+1;}
else
for (a9=1;a9<=n;a9++)
if(a9!=a8&&a9!=a7&&a9!=a6&&a9!=a5&&a9!=a4&&a9!=a3&&a9!=a2&&a9!=a1)
{if(n==9) {printf("%d%d%d%d%d%d%d%d%d\n",a1,a2,a3,a4,a5,a6,a7,a8,a9);t=t+1;}
}
}
}
}
}
}
}
}
printf("共有%d种\n",t);
getchar();getchar();
}
自己辛辛苦苦写的,用dev c运行成功
Ⅲ 在C语言中,如何输出一组数的排列组合
#include <stdio.h>
#include <stdlib.h>
int n = 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)
{
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("请输入连续自然数的个数:");
scanf("%d",&k);
int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++)
{
list[i] = i + 1;
}
// int list[] = {1, 2, 3, 4, 5};
perm(list, 0, k-1);
printf("total:%d
", n);
return 0;
}
该程序的输入为一个任意自然数n,将输出从1到n的全排列。
(3)c语言生成排列算法公式扩展阅读:
C语言的基本数的排列法
1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//n个数,总共需要进行n-1次
{ //n-1个数排完,第一个数一定已经归位
//每次会将最大(升序)或最小(降序)放到最后面
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])//每次冒泡,进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(j=0;j<n;++j)
printf("%-5d ",a[j]);
printf(" ");
}
return 0;
}
2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf(" ");
}
return 0;
}
Ⅳ c语言,如何得到n个数的排列
#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认为是不同的。分给我吧,我可是特意写的哦。
Ⅳ 【c语言】选排列算法
该函数求得是自由组合数,输出是An取k的所有可能组合
#include <stdio.h>
int n,k,a[10];
long count=0;
void perm2(int j)
{
int i,p,t;
if(j==k) //执行条件j=k
{
for(i=k;i<=n;i++)
{
count++; //计数加一
t=a[k]; //
a[k]=a[i]; //
a[i]=t; //这三行是用来交换a[i]与a[k]的值
for(p=1;p<=k;p++)
printf("%1d",a[p]); //打印出a[1]~a[k]的值
printf(" ");
t=a[k];
a[k]=a[i];
a[i]=t; //将a[i],a[k]的值交换回来
if(count%5==0)
printf("\n"); //每打印五个数换行
}
return;
}
for(i=j;i<=n;i++)
{
t=a[j];
a[j]=a[i];
a[i]=t; //交换
perm2(j+1); //递归
t=a[j];
a[j]=a[i];
a[i]=t; //交换
}
}
void main()
{
int i;
printf("\nEntry n,k (k<=n):\n");
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
a[i]=i; //对数组顺序赋值
perm2(1);
}
Ⅵ c语言 排列组合 程序算法
#include<stdio.h>
#include<string.h>
void
Show(int
n,int
len
,char
str[],
char
p[],int
*i)
{
/*函数功能说明: 密码穷举法
递归算法
参数说明:
len
密码可选元素的个数,实际等于
strlen(str);
n
密码位数。
STR[]密码表。
*p
密码排列组合的临时存档
*/
int
a;
n--;
for(a=0;
a
<
len;
a++)
{
p[n]=str[a];
if(n==0)printf("%d:%s
",(*i)++,p);
if(n>0)Show(n,len
,
str,p,i);
}
} /*驱动程序
用于测试*/
int
main(void)
{
char
str[]="abcdef";//密码表
可选元素集合可根据选择修改
int
n=4; //密码位数,根据具体应用而定。
int
len=strlen(str);//用于密码元素集合计数。
char
p[20]; //存放排列组合的密码,用于输出。
int
num=0;//存放统计个数的整数值,
int
*i=#//计数器
地址。
p[n]='\0';//这个不用说啦。 Show(
n,len
,str,
p
,i);
printf("\n%d
位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i); return
0;
}
Ⅶ 求一个C语言排列组合的算法
#include<stdio.h>
#include<stdlib.h>
intmain()
{
intas,sd,df;
inta[4]={1,2,3,4};
for(as=0;as<=3;as++)
{
for(sd=0;sd<=3;sd++)
{
for(df=0;df<=3;df++)
{
if(as!=sd&&as!=df&&sd!=df)
{
printf("%d%d%d ",a[as],a[sd],a[df]);
}
}
}
}
}
Ⅷ C语言数字全排列的问题(急!!)求C代码和算法
#include <stdio.h>
#include <string.h>
char string[]="123456789a";
int used[10]={0};
char output[10];
int length;
void Fun(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;d<length;d++)
{
if(output[d]=='a')
printf("10 ");
else printf("%c ",output[d]);
}
if(output[length]=='a')
printf("10\n");
else
printf("%c\n",output[length]);
}
else
Fun(d+1);
used[i]=0;
}
}
}
int main()
{
int n;
scanf("%d",&n);
string[n]=0;
length=strlen(string)-1;
Fun(0);
return 0;
}
Ⅸ C语言中请问,输入任意的n个数,实现从小到大排列的算法。
定义一个较大的数组,如int a[1000]; //1000个足够了吧,不够可以再加
输入数据时,增加一个记数器,如:
int num,cnt=0;
while( scanf("%d",&num ) == 1 )
{
a[cnt]=num ;
cnt++ ;
}
这样,你就知道输入多少个数了,然后,排序时,也就是知道排多少个数了。