c语言编程问题 求助大佬

2024-12-12 17:38:50
推荐回答(1个)
回答1:

#include 
using namespace std;

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 main()                        //主函数
{RandomPermutation1(8);           //调用方法1
 printf("\n");                    //输出结束符0
 RandomPermutation2(8);           //调用方法1 
 printf("\n");                    //输出结束符0
 RandomPermutation3(8);           //调用方法1 
 printf("\n");                    //输出结束符0
 system("PAUSE");                 //屏幕暂停,以看清运行结果
 return 0;}                       //程序结束
 
/*方法一的函数主体*/
 void RandomPermutation1(int n)    //方法一
{int i,j,*A;                      //定义两个循环变量和一个数组指针
 if(n<=0)                         //如果n不是正整数
   {printf("error");return ;}     //输出error,并结束函数
 A=new int[n];                    //分配一个长度为n的整型数组
 for(i=0;i    {A[i]=RandInt(1,n);           //随机产生1-n之间的数
     for(j=0;j         if(A[i]==A[j]) break;    //如果发现相等退出循环
     if(j     else printf("%d,",A[i]);}    //否则输出A[i] 
 printf("0");                     //输出结束符0
 delete A;                        //函数结束前释放掉数组
 return ;}                        //函数结束
 
/*方法二的函数主体*/
void RandomPermutation2(int n)    //方法二
{int i,j,*A;                      //定义两个循环变量和一个数组指针
 bool *Used;                      //Used数组
 if(n<=0)                         //如果n不是正整数
   {printf("error");return ;}     //输出error,并结束函数
 A=new int[n];                    //分配一个长度为n的整型数组
 Used=new bool[n];                //分配一个长度为n的整型数组
 for(i=0;i for(i=0;i    {while(Used[j=RandInt(1,n)-1]);//随机产生1-n之间没有使用过的随机数
     A[i]=j+1;                    //把随机数赋给A[i]
     Used[j]=true;                //作上已使用的标记
     printf("%d,",A[i]);}         //输出A[i] 
 printf("0");                     //输出结束符0
 delete A;                        //函数结束前释放掉数组
 delete Used;                     //函数结束前释放掉数组
 return ;}                        //函数结束
 
/*方法三的函数主体*/
void RandomPermutation3(int n)    //方法三
{int i,*A;                        //定义一个循环变量和一个数组指针
 if(n<=0)                         //如果n不是正整数
   {printf("error");return ;}     //输出error,并结束函数
 A=new int[n];                    //分配一个长度为n的整型数组
 for(i=0;i for(i=1;i     Swap(&A[i],&A[RandInt(0,i)]);//把A[i]和其中一个随机调换
 for(i=0;i     printf("%d,",A[i]);          //输出A[i] 
 printf("0");                     //输出结束符0
 delete A;                        //函数结束前释放掉数组
 return ;}                        //函数结束

/*交换函数主体*/ 
void Swap(int *a,int *b)          //两数交换函数
{int c;                           //中间变量c
 c=*a;                            //保存a指向的值
 *a=*b;                           //让a指向的值等于b指向的值
 *b=c;}                           //让b指向的值等于a原来的值

/*以下是老师提供的随机函数,这里为了方便调试也一并写出来*/
int RandInt(int i,int j)          //这是老师的随机函数,可以不用写
{static bool a=true;              //通过静态变量,控制函数首次调用种随机种子
 if(a) {srand(time(0));a=0;}      //如果函数首次调用,种一个随机种子
 if(i==j) return i;               //如果i等于j,则函数直接返回i
 if(i else return j+rand()%(i-j+1);}   //获得j-i之间的随机数