花了我一个晚上时间想的-。-大佬们觉得有趣~ 留个赞吧 ~感谢感谢
无趣的难理解的0.0递归版本
#include <stdio.h>
void array (int a[],int n,int m)
{
if(n==m)
{
for(int i=0;i<=m;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(int i=n;i<=m;i++)
{
int t=a[i];a[i]=a[n];a[n]=t;
array(a,n+1,m);
t=a[i];a[i]=a[n];a[n]=t;
}
}
int main(int argc,const char* argv[])
{
int a[]={0,1,2,3}; //修改此处 int a[]={0,1,2,3,4,5,6,7,8,9}
array(a,0,3); //修改此处array(a,0,3)
}
版本1.0随机数 数组版本
用数组来存0-9 这个代码我没有跑出来 哈哈哈哈 太久了 理论上是对的
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
char q[10];
char a[3628800][10];
//取一个10位每位不同0-9 修改q数组
void f ( void )
{
// int s=0;
srand(time(0));
for(int i=0;i<10;i++)//10格 0-9存入 每隔不同
{
q[i]=rand()%10;
for(int j=0;j<i;j++)
{
if(q[i]==q[j])
{
i--;
break;
}
}
}
/*
for(int i=0;i<10;i++)
{
s=s*10+a[i];
}
return s;
*/
}
int main(int argc,const char* argv[])
{
int z;
for(int i=0;i<3628800;i++)//10!行
{
z=0;
sleep(1);
f();//调用函数 更新数组q[10]
for(int k=0;k<10;k++) //q[10] 存入 a[i]行
a[i][k]=q[k];
for(int j=0;j<i;j++) //对比0-i-1行 找是否有相同的
{
for(int k=0;k<10;k++)//对比列
{
if(a[j][k] == q[k]) //如果相同z++
{
z++;
}
}
if(z==10) //z等于10意味 与当前行相同 结束下面行对比 回去重新更新i行
{
i--;
break;
}
}
}
for(int i=0;i<3628800;i++)//输出
{
for(int j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
版本2.0 随机数 升级版本
可以修改定义宏X C还修改全排列的的数量 X为位数 C为X的阶乘的值 如果需要0-9则后面要加个位数判断 如果是9位数则首位加个0在输出值 否则不需要 可以直接输出。 估计是用不着 因为1234全排列我就跑了好久
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define X 3//位数 123的全排列 改4则为1234的全排列下面的C改24
#define C 6//位数的阶层
int q[C];
int f ( void )
{
int s=0,a[X];
srand(time(0));
for(int i=0;i<X;i++)
{
a[i]=rand()%X+1;//0-9的话这边也需要修改
for(int j=0;j<i;j++)
{
if(a[i]==a[j])
{ i--;
break;
}
}
}
for(int i=0;i<X;i++)
{
s=s*10+a[i];
}
return s;
}
int main(int argc,const char* argv[])
{
for(int i=0;i<C;i++)
{
q[i]=f();
for(int j=0;j<i;j++)
{
if(q[i]==q[j])
{
i--;
break;
}
}
}
for(int i=0;i<C;i++)// 0-9的话 这边需要加个判断位数 首位补0
{
printf("%d \n",q[i]);
}
}
3.0版本简单易懂版本
当前为3位数全排列 换成注释内的东西则为10位数的全排列 简单易懂
#include <stdio.h>
int main(int argc,const char* argv[])
{
int i=6;//int i=3628800;
int t,j=1;
int a[3]={0,1,2};//int a[10]={0,1,2,3,4,5,6,7,8,9};
while(i--)
{
printf("%d%d%d\n",a[0],a[1],a[2]);//printf("%d%d%d%d%d%d%d%d%d%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
t=a[0];
a[0]=a[j];
a[j]=t;
j++;
if(j==3)// if(j==10)
j=1;
}
}