#include<stdio.h>
#define N 5
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,a=0,b[5];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
if(str[i]>str[j])b[m++]=str[j];
}
i=0 ;
while(i<n)
{
if(str[i]==i+1)
{
a=1;
}
i++;
}
if(a==0)
{
printf(" 第%2d种情况:",cont++);
for(i=0;i<n;i++)
printf("%d",str[i]);
printf("\n");
}
}
void perm(int str[],int k,int n)
{
int i,temp ;
if(k==n-1)
{
test(str,n);
}
else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n);
temp=str[i];
str[i]=str[k];
str[k]=temp ;
}
}
}
int main()
{
int str[N],i ;
for(i=0;i<N;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,N);
printf("\n");
return(0);
}
/*不知道楼主是这个意思*/
----------------解决方案--------------------------------------------------------
n个有序的元素应有n!个不同的排列。若有一个排列使得所有元素都不在原来位置上,则称这个排列为错排。任给一个n,编写程序求出1,2,…,n的所有错排方案及错排个数Dn。
1)输入n;
2)输出1,2,…,n的所有错排方案及错排个数Dn。
要列出所有的错排方案的
----------------解决方案--------------------------------------------------------
刚才运行了11楼的程序,没有错误,但是好象有点不符合题意,可能是我说的不够清楚,还是很谢谢你喔!
原题已经发在上面了,不知道还能不能帮帮忙啊,谢谢啊!!!
----------------解决方案--------------------------------------------------------
你可以在11楼的基础上加上一条scanf()语句,同时更改宏定义中N的长度.
不过这个程序的计算不会超过 15!,在 8!以下的时间复杂度是可以忍受的,也就是说只能对8个数进行排序统计。
----------------解决方案--------------------------------------------------------
14楼的要是会的话,直接把程序弄出来吧
谢谢啊!
----------------解决方案--------------------------------------------------------
[QUOTE]14楼的要是会的话,直接把程序弄出来吧
谢谢啊![/QUOTE]
干嘛,激我呢?
不会!
----------------解决方案--------------------------------------------------------
别啊!大哥,我才是真的不会
帮帮忙嘛!
----------------解决方案--------------------------------------------------------
#include <stdio.h>
#include <string.h>
#define N 100
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,a=0,b[N];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
if(str[i]>str[j])b[m++]=str[j];
}
i=0 ;
while(i<n)
{
if(str[i]==i+1)
{
a=1;
}
i++;
}
if(a==0)
{
printf(" 第%2d种情况:",cont++);
for(i=0;i<n;i++)
printf("%d",str[i]);
printf("\n");
}
}
void perm(int str[],int k,int n)
{
int i,temp ;
if(k==n-1)
{
test(str,n);
}
else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n);
temp=str[i];
str[i]=str[k];
str[k]=temp ;
}
}
}
int main()
{
int str[N],i,n;
puts("输入数字");
scanf("%d",&n);
for(i=0;i<n;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,n);
printf("\n");
return(0);
}
就这样,很简单吧。
输入不要大于8,否则你会等很久。
----------------解决方案--------------------------------------------------------
呵呵!厉害,太好了!谢谢啊~
马上试试喔
----------------解决方案--------------------------------------------------------
#include<stdio.h>
#define N 10
int cont=1 ;
void test(int str[],int n)
{
int i,j,m,a=0,b[5];
for(i=0;i<n;i++)
{
m=0 ;
for(j=i;j<n;j++)
if(str[i]>str[j])b[m++]=str[j];
}
i=0 ;
while(i<n)
{
if(str[i]==i+1)
{
a=1;
}
i++;
}
if(a==0)
{
printf(" 第%2d种情况:",cont++);
for(i=0;i<n;i++)
printf("%d",str[i]);
printf("\n");
}
}
void perm(int str[],int k,int n)
{
int i,temp ;
if(k==n-1)
{
test(str,n);
}
else
{
for(i=k;i<n;i++)
{
temp=str[k];
str[k]=str[i];
str[i]=temp ;
perm(str,k+1,n);
temp=str[i];
str[i]=str[k];
str[k]=temp ;
}
}
}
int main()
{
int str[N],i,n;
printf("输入位数:(不超过9)");
scanf("%d",&n);
for(i=0;i<n;i++)str[i]=i+1 ;
printf("各种情况:\n");
perm(str,0,n);
printf("\n");
return(0);
}
/*这里的全排列当然全是个位数字,我只能给出到9的了,虽然超过这个可以运行出来,但是9时,运行时间已经不能忍受了.*/
----------------解决方案--------------------------------------------------------