user-0 提问: 有m组数，任意取n组（m>n），合并n组数，组成新集合，计算新集合里元素的个数?

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define     MAX_SIZE    3  struct num_info {     int num;     int *list; };  void init_num(struct num_info **p, int len); void reinit_num(struct num_info **p, int len); void print_arr(struct num_info *p); void bubble_sort(int *arr, int len); void merge_nums(struct num_info *p1, struct num_info *p2, struct num_info **pnew);  int main(void) {     int i;     struct num_info *parr[MAX_SIZE], *pnew;      init_num(parr, MAX_SIZE);     for (i = 0; i < MAX_SIZE; i++) {         bubble_sort(parr[i]->list, parr[i]->num);         print_arr(parr[i]);     }      merge_nums(parr[1], parr[2], &pnew);      print_arr(pnew);      reinit_num(parr, MAX_SIZE);     free(pnew->list);     free(pnew);      return 0; }   void init_num(struct num_info **p, int len) {     int i, j, num;      for (i = 0; i < len; i++) {         p[i] = (struct num_info *)malloc(sizeof(struct num_info));         if (!p[i])             exit(0);         printf("Please input the number: ");         scanf("%d", &num);         p[i]->list = (int *)malloc(num * sizeof(int));         if (!p[i])             exit(0);         p[i]->num = num;         printf("Please input the data: ");         for (j = 0; j < num; j++)             scanf("%d", p[i]->list + j);     } }  void reinit_num(struct num_info **p, int len) {     int i;      for (i = 0; i < len; i++) {         free(p[i]->list);         free(p[i]);     } }  void print_arr(struct num_info *p) {     int i;      for (i = 0; i < p->num; i++)         printf("%d\t", p->list[i]);     printf("\n"); }  void bubble_sort(int *arr, int len) {     int i, j;      int tmp;     for (i = 0; i < len - 1; i++)         for (j = 0; j < len - 1 - i; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  void merge_nums(struct num_info *p1, struct num_info *p2, struct num_info **pnew) {     int i = 0, j = 0, k = 0;      *pnew = (struct num_info *)malloc(sizeof(struct num_info));     if (!(*pnew))         exit(0);     (*pnew)->list = (int *)malloc(sizeof(int) * (p1->num + p2->num));     if (!(*pnew)->list)         exit(0);      while (i < p1->num && j < p2->num) {         if (p1->list[i] > p2->list[j]) {             (*pnew)->list[k++] = p2->list[j];             j++;         } else if (p1->list[i] < p2->list[j]) {             (*pnew)->list[k++] = p1->list[i];             j++;         } else {             i++;             j++;         }     }     while (i < p1->num) {         (*pnew)->list[k++] = p1->list[i];         i++;     }     while (j < p2->num) {         (*pnew)->list[k++] = p2->list[j];         j++;     }     (*pnew)->num = k; } 这个程序可以实现你的需求； 但是有一个问题，如果数组中有重复的数据，得到的组合数据里也有重复的数据，建议自己改一下程序，避免这个问题。

user: user-0
content: 比如有三组数m1=（1，9，20，75）m2=（63，75，82）m3=（1,9,63,89） 从三组数中取任取两组数组合，假如取m2和m3，合并两个数组得n1=（1，9，63，75，82，89），计算n1里面数的个数是6个

user: user-2
content: 两个常规方法： 1： 组合，去重（遍历，如果是重复的则把它放置在末端） 例如：2 2 3 1 3 0)设开始索引begin = 0，末端索引 last = 4； 1）首先取第一个数2，从它下一个数开始对比； 2）第二个元素是2，跟第一个数重复，跟末端数调换 2 3 3 1 2，同时末端索引-1，即last == 3； 3）如果重复进行从该处进行比较，否则比较下一个位置的元素，直到到达末端结点； 4）重复上述2~3步骤（跟冒泡排序有点类似，此处区别只是比较到末端结点就停止了，还有步骤3中的重复调换后比较的位置不变）  2： 写个有序数列，一个个元素插入进去，最后的结果是有序并且唯一的

user: user-1
content: 建议你把你的需求说的详细一些，如果可以，列举一些例子最好了； 复杂的项目还得写需求文档呢，你的这个需求，起码需要几句说明一下吧