有一个数组a[1000],要求每隔两个数删掉一个数,到末尾则又循环到开头继续进行,求最后一个被删掉的数的原始下标位置
例如,一个数组:{0, 1, 2, 3, 4, 5, 6, 7}
0->1->2(第一遍,删除)->3->4->5(第一遍,删除)->6->7->0(第二遍,删除)->1->2(已删除)->3->4(第二遍,删除)->5(已删除)->6->7 …循环直到数组中最后一个元素被删除 #define ARRAY_SIZE_MAX 1000 #define DEL_ARRAY_FLAG 1 #define DEL_GAP_VALUE 2 /* 获取当前数组可用的下标值 * array: 需要操作的数组名 * idx:数组下标值,由于其值需要被改变,所以使用指针传递 */ static void get_index(int *array, int *idx) { int tmp = *idx; //继承当前数组下标的值 if (++tmp >= ARRAY_SIZE_MAX) { //下标自增,并判断是否超出范围 tmp = 0; //超出范围下标置0 } while (DEL_ARRAY_FLAG == array[tmp]) { //循环判断该下标数据是否已经被删除 if (++tmp >= ARRAY_SIZE_MAX) { //若当前下标已被删除,下标自增,并判断是否超出范围 tmp = 0; } } *idx = tmp; } int main (void) { int array[ARRAY_SIZE_MAX] = {0}; //定义一个需要查找最后删除下标的数组 int next = -1, del = 0; //next为数组下标,del为已删除的下标个数 while (1) { int gap = 0; //间隔计数值,每删除一次下标重置一次 get_index(array, &next); //获取当前数组可用下标 while (1) { if (DEL_GAP_VALUE == gap) { //间隔计算值符合要求时,删除对应的数组下标 array[next] = DEL_ARRAY_FLAG; //标记该下标数组已被删除 /*printf("array[%d] del\n", next);*/ if (++del >= ARRAY_SIZE_MAX) {//判断删除的下标个数是否超过数组最大个数 printf("the last del num is %d\n", next);//输出最后一个被删除的下标 return 0; } } if (++gap > DEL_GAP_VALUE) { //完成一次下标删除,跳出循环,重置gap break; } get_index(array, &next); //获取当前数组可用下标 } } return 0; }