单循环实现向量A偶数存B头部奇数存B尾部的do while条件问题
需求说明
- 对向量进行排序,优先展示偶数,再展示奇数
- 具体规则:将向量A的偶数从向量B的起始位置插入,奇数从向量B的末尾位置插入
- 实现限制:仅可使用单个循环结构完成上述插入逻辑
原有代码问题
现有代码中第二个do while循环的赋值逻辑存在错误:直接使用遍历A的下标i作为B的赋值索引,会导致B数组中间位置出现赋值冲突、数据错乱,无法实现偶数连续排在前、奇数连续排在后的需求。
你询问的do while循环条件无需修改,保持i < 25即可,问题出在循环内部的赋值逻辑,需要新增两个指针分别标记B数组的偶数插入位置和奇数插入位置。
修正后完整代码
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { int i, j, A[25], B[25], testeNumeroIgual = 0, aux; // 新增双指针,left标记偶数插入位置,right标记奇数插入位置 int left = 0, right = 24; srand(time(NULL)); i = 0; do { A[i] = rand() % 40; testeNumeroIgual = 0; for (j = 0; j < i; j++) { if (A[j] == A[i]) { testeNumeroIgual = 1; } } if (testeNumeroIgual == 0) i++; } while(i < 25); i = 0; // 依然是单个do while循环,满足实现限制 do { if (A[i] % 2 == 0) { // 偶数从B数组左侧插入,插入后左指针右移 B[left++] = A[i]; } else { // 奇数从B数组右侧插入,插入后右指针左移 B[right--] = A[i]; } i++; } while(i < 25); for (i = 0; i < 25; i++) { printf("%d\n", B[i]); } return 0; }
实现说明
- 新增的left指针初始值为0,对应B数组的起始位置,每插入一个偶数就自增1,指向下一个偶数的插入位
- 新增的right指针初始值为24,对应长度为25的B数组的末尾位置,每插入一个奇数就自减1,指向下一个奇数的插入位
- 整个处理A元素插入B的逻辑依然使用单个do while循环实现,符合要求
- do while的循环条件保持
i < 25即可,作用是遍历完A数组的全部25个元素
内容的提问来源于stack exchange,提问作者Patrick Masceno Farias
相关产品推荐
相关产品推荐

