randnumber_mn.c 生成一个数组,包括k个不重复的整数,并且要求这些整数范围为[m,n),生成的结果中不能包含inum中的数字,size表示inum的长度
2011-12-18 22:50
976 查看
#include <stdlib.h> #include <memory.h> #include <time.h> //--------------------------------------------------------- //位操作 enum { BITSPERWORD = 32, SHIFT = 5, MASK = 0x1F }; struct tagBitOption; typedef struct tagBitOption BitOption; struct tagBitOption { int (*init)(BitOption * bit, int m, int n, int k); void (*destroy)(BitOption ** bit); void (*set)(BitOption * bit, int i); void (*clr)(BitOption * bit, int i); int (*test)(BitOption * bit, int i); int m, n, k, *x; }; static void set(BitOption * bit, int i) { int t; if (bit && (i >= bit->m) && (i < bit->n)) { t = i - bit->m; bit->x[t>>SHIFT] |= (1 << (t & MASK)); } } static void clr(BitOption * bit, int i) { int t; if (bit && (i >= bit->m) && (i < bit->n)) { t = i - bit->m; bit->x[t>>SHIFT] &= ~(1 << (t & MASK)); } } static int test(BitOption * bit, int i) { int t; if (bit && (i >= bit->m) && (i < bit->n)) { t = i - bit->m; return bit->x[t>>SHIFT] & (1 << (t & MASK)); } return 1;//若i不在范围[m,n),则认为i存在的,外面需要继续产生随机数 } static int init(BitOption * bit, int m, int n, int k) { int s; int ret = 0; if (bit) { bit->m = m; bit->n = n; bit->k = k; s = (1 + (n - m)/BITSPERWORD) * sizeof(int); bit->x = (int *)malloc(s); if (bit->x) { memset(bit->x, 0, s); ret = 1;//成功 } } return ret; } static void destroy(BitOption ** bit) { if (bit) { if (*bit) { if ((*bit)->x) free((*bit)->x); free(*bit); *bit = NULL; } } } //某些数字不能出现在随机数结果中,这里设置一下 static void setInvalidNumber(BitOption * bit, int * inum, int size) { if (bit && inum && size > 0) { int i; for (i = 0; i < size; i++) { bit->set(bit, inum[i]); } } } static BitOption * createBitOption(int m, int n, int k) { BitOption * b = NULL; b = (BitOption *)malloc(sizeof(BitOption)); if (b) { memset(b, 0, sizeof(BitOption)); b->init = init; b->destroy = destroy; b->set = set; b->clr = clr; b->test = test; if (!b->init(b, m, n, k)) b->destroy(&b); } return b; } //--------------------------------------------------------- //生成一个数组,包括k个不重复的整数,并且要求这些整数范围为[m,n) //生成的结果中不能包含inum中的数字,size表示inum的长度 //m < n, k < n - m int * RandNumberMN(int m, int n, int k, int * inum, int size) { int i,t; int * result = NULL; BitOption * bit = NULL; int ok = 0; do { srand((int)time(NULL)); if (m >= n || k > n - m) break; bit = createBitOption(m, n, k); if (NULL == bit) break; setInvalidNumber(bit, inum, size); result = malloc(k * sizeof(int)); if (NULL == result) break; for (i = 0; i < k; i++) { while(bit->test(bit, t = rand()%(n-m+1)+m)); result[i] = t; bit->set(bit, t); } ok = 1; } while (0); if (bit) bit->destroy(&bit); if (1 != ok) { if (result) { free(result); result = NULL; } } return result; } ////////////////////////////////////////////////////////////////////////// //测试 #include <stdio.h> void testRandMN(void) { time_t start, end; int * result = NULL; int m = 490, n = 540, k = 10; int inum[] = {3, 90, 200, 305, 487, 503, 500, 501,502, 504}; printf("m = %d, n = %d, k = %d\n", m, n, k); start = time(NULL); result = RandNumberMN(m, n, k, inum, sizeof(inum)/sizeof(inum[0])); end = time(NULL); printf("time = %d\n\n", end - start); if (result) { printf("RandNumber success!\n"); if (k < 200) {//数量较小时,查看结果是否符合要求 int i; for (i = 0; i < k; i++) { printf("%d, ", result[i]); } printf("\n"); } free(result); result = NULL; } else { printf("RandNumber failed!\n\n"); } }
相关文章推荐
- 生成一个数组,包括k个不重复的整数,并且要求这些整数范围为[0,n)
- 在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- java 一个int数组 长度为100 随机生成100个数 即1-100 将其插入进数组 插入的数字不能重复
- 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<
- 编程产生一个int数组,长度为30,并向其中随机插入1-30,并且不能重复输出数组。实现一个冒泡排序算法对其进行排序,输出排序结果
- 实现求出若干整数之和为500的连续整数(如98,99,100,101,102)的所有组合&&产生一个int数组,长度为100,并向其中随机插入1~100,要求不能重复
- 转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组
- java 一个int数组 长度为100 随机生成100个数 即1-100 将其插入进数组 插入的数字不能重复
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。按照数组下标输出结果。
- 随机生成30个数字(范围0-30)存到一个数组中,将数组中重复的数字去除,动态创建数组保存剩下的数字
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 数组问题:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 产生一个int 数组,长度为100,并向其中随时插入1-100,并且不能重复
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3
- 在一个长度为10的整形数组中,已经放置好了任意10个整数。要求用户任意输入 一个整数,判断该数字是否在数组中。如果在,删除数组中该元素,并把后面的 元素往前挪。(让空出的位置在最后)
- 在一个长度为10的整形数组中,前9个元素是{12,23,34,45,56,67,78,89,90}。 现在要求输入一个整数,把它放到数组中正确的位置当中。(不能删除已有元素)
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)