题目描述:
背景: 假设要生成前n个自然数的一个随机置换,如{4,3,1,5,2}和{3,1,4,2,5}就是一个合法置换; 但{5,4,1,2,1}就不是,因为1出现2次而3没有。假设我们有一个随机数生成器RandInt(i,j),它以相同概率生成i到j之间的整数, 下面是三个算法。 (1) 如下填入从A[0]到A[N-1]的数组A:为了填入A[i],生成不同于A[0],A[1],...,A[i-1]之间的随机数时,才将其填入A[i] (2) 同算法1,但保留一个称为Used数组的附加数组,当一个随机数Ram最初被放入数组A的时候,Used[Ram]=1.这就是说,当用一个随机数填入A[i]时,用Used数组来测试该随机数是否已经被使用。 (3) 首先填写数组使得A[i]=i+1;然后 For(i=1;i<N;i++) Swap(&A[i],&A[RandInt(0,i)]) 要求实现以上三个算法的函数:(1对应(1)中的算法,请务必不要弄混) void RandomPermutation1(int n); void RandomPermutation2(int n); void RandomPermutation3(int n); 在函数中输出为前n个自然数的一个随机置换,用,号分隔 必须使用教师提供的随机函数,函数原型如下: int RandInt(int i, int j); 在文件中加入:extern int RandInt(int i, int j); 即可 (在测试的时候可以使用random函数,但是在向系统提交时必须改成调用RandInt产生随机数) 注意: 1、逗号为英文输入法中逗号; 2、输入n不为正整数时,输出error 3、在输出的结果后多输出",0"(不含外侧引号)表示输出结束,除此之外,其余任意多余输出视为错误。 例如: 1.当参数n = 5时, 输出格式为 1,2,3,4,5,0 2.例如n = 10时,数组的10个元素输出为2,8,5,1,10,9,3,6,7,4,但是需在结果后增加一个0 因此最终输出为: 2,8,5,1,10,9,3,6,7,4,0
参考代码:
#include<stdio.h>
#include<stdlib.h>
extern int RandInt(int i, int j);
void RandomPermutation1(int n);
void RandomPermutation2(int n);
void RandomPermutation3(int n);
void swap(int a, int b);
int A[641111];
static int Used[641111];
int main() {
return 0;
}
void swap(int* a,int* b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void RandomPermutation1(int n)
{
int x;
int* a=NULL;
if(n<=0)
{
printf("error");
exit(-1);
}
a = (int*)malloc(sizeof(int)*n);
if (a==NULL)
{
printf("error");
exit(-1);
}
for(int i=0;i<n;i++)
{
x=RandInt(1,n);
for(int j=0;j<i;j++)
{
if(x==a[j])
{
x=RandInt(1,n);
j=-1;
}
}
a[i]=x;
}
for (int i=0;i<n;i++)
{
printf("%d,",a[i]);
if(i==n-1) printf("0\n");
}
free(a);
}
void RandomPermutation2(int n)
{
int x;
if(n<=0)
{
printf( "error" ) ;
exit(-1);
}
int* b=NULL;
b=(int*)malloc(sizeof(int)*n);
if (b==NULL)
{
printf("error");
exit(-1);
}
int* used=NULL;
used=(int*)malloc(sizeof(int)*n);
if(used==NULL)
{
printf("error");
exit(-1);
}
for (int i=1;i<=n;++i) used[i]=0;
for (int i=0;i<n;i++)
{
x=RandInt(1,n);
while(used[x]!=0)
x=RandInt(1,n);
b[i]=x;
used[x]=1;
}
for (int i=0;i<n;i++)
{
printf("%d,",b[i]);
if(i==n-1) printf("0\n");
}
free(used);
free(b);
}
void RandomPermutation3(int n)
{
int* c=NULL;
if(n<=0)
{
printf("error");
exit(-1);
}
c=(int* )malloc(sizeof(int)*n);
if (c==NULL)
{
printf("error");
exit(-1);
}
for (int i=0;i<n;i++)
c[i]=i+1;
for (int i=1;i<n;i++)
swap(&c[i],&c[RandInt(0, i)]);
for (int i=0;i<n;i++)
{
printf("%d,",c[i]);
if(i==n-1) printf("0\n");
}
free(c);
}
讲解:
这题干也太长了趴!
但不要被吓到,其实就是一个简单的看题敲码,跟着题目要求的一步一步来,就能拿到满分啦。在我的代码中,因为不知道码图是否会多次调用函数,为防止内存不够用,所以使用了malloc()和free()函数,当然,一般码图是不会复杂到内存炸掉的,所以也可以不用这两个函数,有兴趣的小伙伴可以自行百科了解。
另外如果想要对此程序进行调试,可以尝试使用srand()、rand()和time()函数进行生成随机数。
最后,不要忘记在最后加一个 ,0。
求实求真,大气大为。