面试题:求数组元素的交集、从数组中随机选取元素、分解质因数、一左一右顺序排列数组

来源:互联网 发布:淘宝女鞋凉鞋 编辑:程序博客网 时间:2024/05/06 10:36

面试题:求数组元素的交集、从数组中随机选取元素、分解质因数、一左一右顺序排列数组

1、求数组元素的交集

/** 两个数组分别按升序排列,且元素互异* 找出两个数组的交集**/#include <stdio.h>#define N 5#define M 6void findcommon(int *a, int *b, int n, int m){if(NULL==a || b==NULL)return ;if(n<=0 || m<=0)return ;int i=0;int j=0;while(i<n && j<m) //利用了二分查找的思想{if(a[i]<b[j]){i++;}else if(a[i]>b[j]){j++;}else if(a[i]==b[j]){printf("%d ", a[i]);i++;j++;}}}void main(){int a[N] = {1, 3, 5, 7, 9};int b[M] = {2, 4, 5, 6, 9, 12};findcommon(a, b, N, M);printf("\n");}


2、从数组中随机选取元素

/** 从数组a[N]中随机选取m(m<=N)个数* a[N]中各个元素互不相同*/ #include <stdio.h>#include <stdlib.h>void selectrandomly(int *a, int n, int m){if(NULL==a)return ;if(n<=0 || m<0)return ;if(m>n)return ;int i=0, j=0, t=0;for(i=0; i<m; i++){j = rand()%(n-i)+i; //产生从i到n-1之间的随机数t = a[i];a[i] = a[j];a[j] = t;}for(i=0; i<m; i++){printf("%d ", a[i]);}}void main(){srand((unsigned)time(0));int a[5] = {1, 2, 3, 4, 5};int n=5, m=3;selectrandomly(a, n, m);printf("\n");}

在C语言里所提供的随机数发生器的用法:现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:

1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;

2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)

3) 根据需要多次调用rand(),从而不间断地得到新的随机数;

4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。


如何产生设定范围内的随机数  

 由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?

    从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:

    k=rand()%(Y-X+1)+X;

    这样,就可以产生你想要的任何范围内的随机数了。

3、分解质因数

代码:

/**分解质因数**思路:先找到一个最小的质数k,按照下面的方法执行*(1)如果该质数恰巧等于n,说明分解质因数已经结束,直接打印出来*(2)若n>=k,但n%k==0,打印k,并执行n=n/k,重复第一步;*(3)若n%k!=0, k=k+1, 重复第一步。**/#include <stdio.h>#include <math.h>void analyse(int n){if(n<2){printf("%d 不能进行因数分解\n", n);return ;}printf("%d = ", n);int k=2;if(n==2){printf("%d\n", n);}else{for(k=2; k<=sqrt(n); k++){if(n%k==0){ n = n/k; printf("%d*", k); k--;}}printf("%d\n", n);}}void main(){analyse(90);}

运行结果:


4、一左一右顺序排列数组

代码:

/**给定一个数组input[]*如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置;  *如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上。 *然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。*例如:*input[] = {3, 6, 1, 9, 7};*output[] = {3, 7, 9, 6, 1}; *input[] = {3, 6, 1, 9, 7, 8} ;*output[] = {1, 6, 8, 9, 7, 3}。**函数接口   void sort(int *input, int n, int *output)**/#include <stdio.h>void sort(int *input, int n, int *output){if(input==NULL || output==NULL || n<=0){return ;}int i=0, j=0, tmp = 0;// 对数组元素排序,冒泡排序for(i=0; i<n-1; i++){for(j=i; j<n; j++){if(input[j]>input[i]){tmp = input[j];input[j] = input[i];input[i] = tmp;}}}// 按照数组元素的下标奇偶来存放int left = n/2-1;int right = n/2;for(i=0; i<n; i++){if(i%2==0){output[right++]=input[i];}else{output[left--]=input[i];}}for(i=0; i<n; i++)printf("%d ", output[i]);}void main(){/*int a[5]={3, 6, 1, 9, 7};int b[5];int n = 5;*/int a[6]={3, 6, 1, 9, 7, 8};int b[6];int n = 6;sort(a, n, b);printf("\n");}

运行结果:



0 0
原创粉丝点击