如何用C实现N阶排列?

作者&投稿:乜罚 (若有异议请与网页底部的电邮联系)
C语言如何实现任意数排列组合,新手求助,急~

求排列组合没有简单方法。方法只有一个,枚举。
有几个位置需要列举,就需要几个循环。如果循环数量太多,可以用函数递归来枚举。
例程:

#includeint main(){ int a[4]={1,3,4,7}; //第一个位置 int b[4]={2,5,8,10}; //第二个位置 int c[4]={6,9,11,12}; //第三个位置 int i,j,k; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) printf("%d %d %d
,",a[i],b[j],c[k]);//输出一种排列 getch(); return 0;}

刚回答了一个组合的,现在是排列的。方法类似,采用递归方法。

void CopyArrayWithExcept(int a[], int nCount, int b[], int nExcept)
{
for(int i=0, j=0; i<nCount; i++)
{
if(i != nExcept)
{
b[j++] = a[i];
}
}
}

int g_nPrintCount = 0; //为了控制每行输出10个
int ArrangeAll(int a[], int nCount, char* szPre)
{
if(nCount == 1)
{
printf("%s%d ", szPre, a[0] );
if( (++g_nPrintCount%10==0))
{
printf("
");
}
return 1;
}
else
{
int nTotal=0;
for(int i=0; i<nCount; i++)
{
char szBuf[10] ={0};
int *pNum = new int[nCount-1];

sprintf(szBuf, "%s%d", szPre, a[i]);
CopyArrayWithExcept(a, nCount, pNum, i);

nTotal += ArrangeAll(pNum, nCount-1, szBuf);

delete[] pNum;
}

return nTotal;
}

}

int main()
{
int a[] = {1,2,3,4,5,6};
int nTotal = ArrangeAll(a, sizeof(a)/sizeof(a[0]), "");
printf("
Total Count=%d
", nTotal);
return 1;
}

用递归的算法,有点像汉诺塔的递归程序,就是先控制一个不动,让剩余的排列好,然后再移动第一个,再排列好剩余的
这个程序也是这个意思
举个例子说 1234
1。先保持1不动,排列234
2。保持2不动,排列34
3。保持3不动,排列4
4。得到4;输出1234。
5。然后跳转到3,将3与4互换,
6。得到3;输出1243。
7。跳转到2,将2与3互换,
8。重复3-6,得1324,1342。
9。跳转到2,将2与4互换,得到1423,1432。
以下省略若干步。。
最后就得到全排列

程序:

#include <stdio.h>
void permutation(char a[], int m, int n)
{
int i;
char t;
if (m<n-1)
{
permutation(a, m+1, n);
for(i=m+1;i<n;i++)
{
t=a[m]; a[m]=a[i]; a[i]=t;
permutation(a, m+1, n);
t=a[m]; a[m]=a[i]; a[i]=t;
}
}
else
{
printf("%s\n", a);
}
}
int main()
{
char a[]="ABCDE";
permutation(a,0,5);
return 0;
}

n阶全排列是经典问题,可以用二重循环的迭代或递归实现。

有个相对简单的算法,把所有排列理解成一个一个n进制数串,比如2阶全排列理解成2进制数,从十进制0开始遍历,求出他的二进制数串,所有的遍历组成一个2阶排列。

// n阶全排列
// 共有m位 如果是宽度优先的无限搜索,m设成无限大
// MAX = 全排列总可能遍历数,比如m位n进制数,即为n的m次方

int a[m], i, j, t;
for (i = 0; i < MAX; i++)
{
//将10进制数i转为n进制数,输出
t = i;
j = 0;
memset(a, 0, m); //a[]初始化为0
while(t != 0)
{
a[j] = t % n;
t = t / n;
}
// a[j]中存放的即为n阶全排列
for ( j = m-1; j > 0; j--)
printf("%d", a[j] + 1);
printf(" 下一个可能排列\n");
}


在C语言中,如何输出一组数的排列组合
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", n);return 0;}该程序的输入为一个任意自然数n,将输出从1到n的全排列。

用c编写程序,其中利用子函数fun实现计算n(n为函数参数)的阶乘n!在...
include<stdio.h> int fun(int n){ int s=1, i;for(i=1;i<=n;++i)s=s*i;return s;} int main(){ int n, s;printf("请输入n的值:\\n");scanf("%d",&n);s=fun(n);printf("n!=%d\\n",s);return 0;} 测试通过,请采纳 ...

C语言用递归方法求n阶勒让德多项式的值
代码:include<stdio.h> include<stdlib.h> double polya(n,x);int main(){ int x,n;scanf("%d%d",&n,&x);printf("%.2f\\n",polya(n,x));return 0;} double polya(int n,int x){ double y;if(n==0)y=1;if(n==1)y=x;if(n>1)y=((2*n-1)*x*polya(n-1,x)-(n-...

C语言怎么实现排列?
include <stdio.h>int main(void){ char s[]="11111",i,j; for(i=0;i<4;s[i++]='1') for(s[i]='0',j=i+1;j<5;j++){ s[j]='0'; printf("%s\\n",s); s[j]='1'; } return 0;} ...

C语言实现可设置位数26个字母m选n全排
include <stdio.h>#include <string.h>int count=0;\/\/ 此处可添加file *fp;int Check(char x ,char alp[26])\/\/ 判断是否重复出现{ for(int n=0; n<26; n++) if(alp[n]==x && alp[n]!=0 ) return 1; return 0;}void Fun(int m,int n,char temp[26],char alp[26] ...

有一个M×N阶矩阵,求其中最大值和最小值,以及它们的行号和列号。用C...
include<stdio.h>int main(){int m,n,i,j,maxi,maxj,mini,minj; scanf("%d%d",&m,&n); int a[m][n]; maxi=maxj=mini=minj=0; for(i=0;i<m;i++) for(j=0;j<n;j++) {scanf("%d",&a[i][j]); if(a[i][j]>a[maxi][maxj]){maxi=i;maxj=j;} if...

n阶2次行幻方c程序?
用楼梯法最快。奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。填写方法是这样:把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n*n-1个数:(1)、每一个数放在前一个数的右上一格;(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)...

怎样用c程序来快速解决排列组合问题!
include <stdio.h> include include<stdlib.h> void main(){ int i=0;int a[10];int j=0;int temp;srand((unsigned int)time(NULL)); \/\/生成 随机数的 种子 for(i;i<10;i++) \/\/生成 十个随机数 { a[i]=rand()%100+1;} printf("生成的 10个数子为 \\n"); \/\/打印...

用c语言求幻方. 给定任意自然数n>3,要求输出相应的n阶幻方. 如,给定n...
只实现了奇数的情况,其他情况参照百度百科。include<stdio.h>#include<stdlib.h>#include<memory.h>void magic(int);void magic1(int);void magic4(int);void magic42(int);void magic(int n){ if(n==1) { printf("1\\n"); return; } if(n==2) { printf("...

用c语言编程:键盘上输入N个整数,使该数组中的数按照从小到大的次序排列...
include "stdio.h"define N 10 int main(int argc,char *argv[]){ int a[N],i,j,k;printf("Please enter %d integer(s)...\\n",N);for(i=0;i<N;scanf("%d",a+i++));\/\/输入 for(i=0;i<N;i++){\/\/选择法排序 for(k=i,j=k+1;j<N;j++)if(a[k]>a[j])k=j;if...

柘城县15189298526: 用c语言编程 求n阶行列式 -
勇乔奇米: #include<stdio.h> void main() { int n,a,b,y[10],x[10],i,j,temp; float m[10][10],k=1; printf("Input \"n\""); scanf("%d",&n); printf("input the matrix:\n"); for(b=1;b<=n;b++) { printf("next row:\n"); for(a=1;a<=n;a++)scanf("%f",&m[a][b]); } for(b=1...

柘城县15189298526: 用C语言 编写计算N阶行列式值得程序 -
勇乔奇米: #define N 4#include #include void main() { int i,j,m,n,s,t,k=1; double a[N][N],f=1,c,x,sn; for (i=0;ifor (j=0;jscanf ("%lf",&a[i][j]); for (i=0,j=0;i{ if (a[i][j]==0) { for (m=i;a[m][j]==0;m++); if (m==N) { sn=0; printf("detA=%lf\n",sn); exit(0); } else for (n=j;n{ c=...

柘城县15189298526: 用C语言计算N阶行列式 -
勇乔奇米: #define N 4#include <stdio.h>#include <stdlib.h> void main() { int i,j,m,n,s,t,k=1; double a[N][N],f=1,c,x,sn; for (i=0;i<N;i++) for (j=0;j<N;j++) scanf ("%lf",&a[i][j]); for (i=0,j=0;i<N&&j<N;i++,j++) { if (a[i][j]==0) { for (m=i;a[m][j]==0;m++); if (m==N) { sn=0; ...

柘城县15189298526: c语言中的n阶方阵怎嘛做 -
勇乔奇米: C语言中int型的数值非常的小,最大的范围也只在[-2^31 , 2^31 -1],所以使用int类型最大只能表示13的阶乘而已,使用范围更大的double才是王道./* Note:Your choice is C IDE */#include "stdio.h" void main() { int i,n,flg; double num=1; printf("...

柘城县15189298526: 如何用C语言编出一个N阶螺旋方阵?例如:1234<br/>121
勇乔奇米: int n为阶数,具体打印格式你可以按需要改void op(int n){ int i=0,j=0; int*(*p); int temp = 1; int t; p = (int**)malloc(sizeof(int*)*n); for (t=0;t=t;j--) p[i][j] = temp ; j ; i--; for(;i>t;i--) p[i][j] = temp ; j ; i ; } for (i=0;i { for (j=0;j { printf("= ",p[i][j]); } printf("\n"); }}.

柘城县15189298526: 关于C语言的问题:如何用C语言实现n阶行列式和矩阵的值
勇乔奇米: 输入: 3---7 2---1 得出错误结果. 而当输入n=3 0---1---3 3---0---2 5---2---0 时也会得出错误结果. 错误的原因有2: 1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯定是整数,但是他程序中使用了整型数的除...

柘城县15189298526: 用C或C++怎么编写求N阶行列式的值?要求有具体算法和程序.
勇乔奇米: #include <stdio.h> int main() { int a[100][100],b[100][100],c[100][100],n,i,j,h; printf("first:\n"); scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); printf("second:\n"); //由矩阵的乘法原则 两个如果都是方阵 阶数 必须相同! ...

柘城县15189298526: 求c语言算法:利用上三角形算法实现N阶行列式的计算. -
勇乔奇米: 高斯阶梯型行列式法可以实现为上三角行列式,即,将每一行确保缩进一列,每一行第一个元素(主元)以下均为0元素,线性代数课本第一章有详细步骤

柘城县15189298526: 用C语言解决:求任意阶(n阶)矩阵的行列式 -
勇乔奇米: 很遗憾,上面匿名的程序不正确. 比如n=2 输入: 3---7 2---1 得出错误结果. 而当输入n=3 0---1---3 3---0---2 5---2---0 时也会得出错误结果. 错误的原因有2: 1 是数据类型不对,匿名的程序是设定输入都是整数int,显然按照行列式的定义结果肯...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网