中易网

c语言 给出一个数怎样输出该数的全排列

答案:3  悬赏:50  
解决时间 2021-01-15 01:06
c语言 给出一个数怎样输出该数的全排列
最佳答案
递归法:
设输入的数为n,N={1,2,...n}
不断选择数字i,把i从N中剔除,直到N为空集即可
代码如下:
#include
#include
#include

int N;
bool *mark;
int *output, pos = 0;

void AddNumber(int i)
{
bool finish = true;
mark[i] = true;
output[pos++] = i;

int j;
for (j = 0; j < N; j++)
{
if (!mark[j])
{
finish = false;
AddNumber(j);
}
}

if (finish)
{
for (j = 0; j < pos; j++)
printf("%d", output[j] + 1);
printf("\n");
}

pos--;
mark[i] = false;
}

int main()
{
scanf("%d", &N);
mark = (bool *)malloc(sizeof(bool) * N);
output = (int *)malloc(sizeof(int) * N);

memset(mark, (bool)0, sizeof(bool) * N);

int i;
for (i = 0; i < N; i++)
AddNumber(i);

free(mark);
free(output);
system("pause");
return 0;
}
全部回答
#include<stdio.h>
const int MAXN=100000;
void print_permutation(int n,int *A,int cur)
{
int i,j;
if(cur==n)
{
for(i=0;i<n;i++)
printf("%d",A[i]);
printf("\n");
}
else for(i=1;i<=n;i++)
{
int ok=1;
for(j=0;j<cur;j++)
if(A[j]==i)
ok=0;
if(ok)
{
A[cur]=i;
print_permutation(n,A,cur+1);
}
}
}
int main()
{
int n,cur;
int A[MAXN];
cur=0;
scanf("%d",&n);
print_permutation(n,A,cur);
return 0;
}

参考资料:刘汝佳 (《算法竞赛入门经典》)


C语言版:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[10], book[10], n, k[10], l;
void dfs(int step)
{
int i = 0;
if(step == l + 1)
{
if(a[1] != 0)
{
for(i = 1; i <= l; i++)
{
printf("%d", a[i]);
}
printf(" ");
}
return ;
}
for(i = 0; i < l; i++)
{
if(book[k[i]] == 0)
{
a[step] = k[i];
book[k[i]] = 1;
dfs(step + 1);
book[k[i]] = 0;
}
}
}
int main(void)
{
memset(k, 0, sizeof(k));
memset(book, 0, sizeof(book));
int n;
scanf("%d", &n);
char buf[15] = "";
sprintf(buf, "%d", n);
l = strlen(buf);
    int i = 0;
for(i = 0; i < l; i++)
k[i] = buf[i] - '0';
dfs(1);
    system("pause");//如果通不过编译就试着删除这句话
return 0;
}
C++版:
#include<cstdio>
#include<cstdlib>
#include<cstring>
int a[10], book[10], n, k[10], l;
void dfs(int step)
{
if(step == l + 1)
{
if(a[1] != 0)
{
for(int i = 1; i <= l; i++)
{
printf("%d", a[i]);
}
printf(" ");
}
return ;
}
for(int i = 0; i < l; i++)
{
if(book[k[i]] == 0)
{
a[step] = k[i];
book[k[i]] = 1;
dfs(step + 1);
book[k[i]] = 0;
}
}
}
int main(void)
{
memset(k, 0, sizeof(k));
memset(book, 0, sizeof(book));
int n;
scanf("%d", &n);
char buf[15] = "";
sprintf(buf, "%d", n);
l = strlen(buf);
for(int i = 0; buf[i] != ''; i++)
k[i] = buf[i] - '0';
dfs(1);
return 0;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
王者荣耀吃鸡模式
【急】如何让大猫接受小猫
用耳麦的是时候,QQ语音的时候点了一下麦克风
雷电皇比卡丘传说哪抓NO.108大舌头啊
为什么3d渲染vr灯不亮是什么原因
寿阳聚金湾大酒店怎么去啊,我要去那办事
虚荣人格缺陷如何矫正
天迈d08手机屏幕锁住了打不开怎么办
勿屈己徇人,勿沽名而钓誉。以诚接物,勿挟褊私
从坝上草原带回来的干支梅,怎么放呢?带根的
蒸馏法海水淡化的多级闪蒸技术
安装了dev c++还需要装gcc编译器吗
小小事件 歌词
带罗字的古诗?
求解:梦见自己拉屎总是拉不完!有什么征兆么
推荐资讯
500W是大功率电器吗
什么是非漫游流量?
云南大理宾I川县的经纬度,宾川在大理洲的什
日历中的(尾牙)是什么意思?
爱剪辑重装后videoclip没了 之前用了爱剪辑自
左边的颈痛是怎么回事
三一挖机215C一8动作慢为什么
尼康d32oo相机配尼康18一1o5镜头合理吗
为何iPhone 6 / 6 Plus 都快成街机了,App
who is he?
大肠杆菌上有两种毛,一种长的,另一种短,
C++中virtual和非virtual版本对在派生类重写
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?