/* 用c语言完成函数 size_t foo(unsigned int *a1, size_t al1, unsigned int* a2, size_t al2) 悬赏分:10 | 离问题结束还有 14 天 23 小时 | 提问者:龙潇九声 | 检举 其中a1 和a2 都为无符号数组,al1 和al2 为数组的长度,数组的长度为偶数。 无符号数组由一对数字区间组成。如下例: a1 为 0,1,3,6,10,20 a2 为 0,1,20,50,4,5 则 a1 表示以下区间[0,1] [3,6] [10,20] a2 表示以下区间[0,1] [20,50] [4,5] 则a1,a2 的重叠部分为[0,1] [4,5],其长度为2 函数foo 要求返回重叠区间的长度。上例中为2. */ #include <stdio.h> #include <stdlib.h> int Cmp(const void * v1, const void *v2) { return *(unsigned int *)v1 > *(unsigned int *)v2; } size_t foo(unsigned int *a1, size_t al1, unsigned int* a2, size_t al2) { qsort(a1, al1, sizeof(unsigned int), Cmp); qsort(a2, al2, sizeof(unsigned int), Cmp); size_t counter1 = 0, counter2 = 0; size_t length = 0; while (2 * counter1 <= al1 && 2 * counter2 <= al2) { if (a1[2 * counter1 + 1] <= a2[2 * counter2]) { ++counter1; } else if (a2[2 * counter2 + 1] <= a1[2 * counter1]) { ++counter2; } else { int start = a1[2 * counter1] > a2[2 * counter2] ? a1[2 * counter1] : a2[2 * counter2]; int end = a1[2 * counter1 + 1] > a2[2 * counter2 + 1] ? a2[2 * counter2++ + 1] : a1[2 * counter1++ + 1]; length += end - start; } } return length; } int main() { unsigned a1[6] = {0,1,3,6,10,20}; unsigned a2[6] = {0,1,20,50,4,5}; size_t l = foo(a1, 6, a2, 6); printf("%u/n", l); return 0; }