偶这里有两个算法 一个是字典顺序,一个是旋转法;
字典的如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define SWAP(x,y){int temp;temp=x;x=y;y=temp;}
void main()
{
int perm[MAXSIZE];
int last;
int n;
int left,right,i,j;
char line[100];
gets(line);
n=atoi(line);
for(i=0;i<n;i++)
perm[i]=i+1;
for(last=0;last>=0;){
printf("\n");
for(i=0;i<n;i++)
printf("%d ",perm[i]);
for(last=n-2;last>=0&&perm[last]>perm[last+1];last--);
for(j=n-1;perm[last]>perm[j];j--);
SWAP(perm[last],perm[j]);
for(left=last+1,right=n-1;left<right;left++,right--)
SWAP(perm[left],perm[right]);
}
}
旋转如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define ROTATE(p){
\
int i,temp;
\
temp=perm[p];
\
for(i=p-1;i>=0;i--)
\
perm[i+1]=perm[i]; \
perm[0]=temp;
\
}
void main()
{
int perm[MAXSIZE];
int position;
int n;
int i;
char line[100];
printf("\nPermutation by Rotation Method");
printf("\n==============================");
printf("\n\nNumber of Elements --> ");
gets(line);
n=atoi(line);
for(i=0;i<n;i++)
perm[i]=i+1;
position=n-1;
while(position!=0){
printf("\n");
for(i=0;i<n;i++)
printf("%d ",perm[i]);
position=n-1;
ROTATE(position);
while(perm[position]==position+1&&position!=0){
position--;
ROTATE(position);
}
}
}
字典的没写输出提示;将就下吧
我想恳请高手帮我改下使它用在这程序;
这两个程序我是在 c语言名题精选百则(技巧篇)冼镜光编著,这里找到的