数字全排列
全排列往往运用递归来进行编程,以下相关问题,大家自己先尝试做一下,多练习几个类似的就会做这类相关问题了。
刷起来~~~~~~~
1.要求:实现输入一个正整数,输出改数字以内的正整数全排列。
代码:
#include<stdio.h>
void swap(int* a,int* b){
int t=*a;
*a=*b;
*b=t;
}
void prm(int* list,int k,int n){
if(k>n)
{for(int i=0;i<=n;i++)
printf("%d",list[i]);
printf("\n");
}
else{
for(int j=k;j<=n;j++){
swap(&list[k],&list[j]);
prm(list,k+1,n);
swap(&list[k],&list[j]);
}
}
}
int main(){
int n,a[20];
scanf("%d",&n);
for(int i=0;i<n;i++){
a[i]=i+1;
}
prm(a,0,n-1);
}
2.展示:
字母全排列
1.要求:输入一个字符串,打印该字符串的所有排列。
代码:
#include<stdio.h>
#include<string.h>
void swap(char* a,char* b){
char t=*a;
*a=*b;
*b=t;
}
void prm(char* list,int k,int n){
if(k>n)
{for(int i=0;i<=n;i++)
printf("%c",list[i]);
printf("\n");
}
else{
for(int j=k;j<=n;j++){
swap(&list[k],&list[j]);
prm(list,k+1,n);
swap(&list[k],&list[j]);
}
}
}
int main(){
char a[20];
scanf("%s",&a);
int n=strlen(a);
prm(a,0,n-1);
}
2.展示
对于字符串排列代码,可以改进,如下:
#include<stdio.h>
#include<string.h>
void swap(char* a,char* b){
char t=*a;
*a=*b;
*b=t;
}
void prm(char* list,int k){
if(k==strlen(list))
{printf("%s",list);
printf("\n");
}
else{
for(int j=k;j<strlen(list);j++){
swap(&list[k],&list[j]);
prm(list,k+1);
swap(&list[k],&list[j]);
}
}
}
int main(){
char a[20];
scanf("%s",&a);
prm(a,0);
}