C语言奇偶数组拆分程序运行结果相反,求错误原因
问题原因
你代码的核心问题是赋值逻辑错误:判断完arr[i]的奇偶性后,错误把**数组下标i**存入了目标数组,而非数组元素arr[i]本身。
具体为什么会出现结果相反的现象:
- 原始数组
arr的元素和下标的对应关系为arr[0]=1(奇数)、arr[1]=2(偶数)、arr[2]=3(奇数)、arr[3]=4(偶数)……以此类推 - 当你判断到
arr[i]是偶数时,存入的是下标i:比如arr[1]=2是偶数,就存1到偶数数组,arr[3]=4是偶数就存3到偶数数组,最终偶数数组里存的全是值为奇数的下标,看起来就像存了奇数 - 同理判断到
arr[i]是奇数时,存入的下标i都是偶数,最终奇数数组里存的全是值为偶数的下标,看起来就像存了偶数
修正方案
只需要把赋值部分的i替换为arr[i]即可,同时可以简化判断逻辑(非偶即奇,不需要二次判断),修正后的完整代码如下:
#include <stdio.h> int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,0}; int arr_chan[10]; int arr_le[10]; int i, chan=0,le=0; for(i=0;i<10;i++){ if(arr[i]%2==0){ arr_chan[chan]=arr[i]; chan++; } else{ arr_le[le]=arr[i]; le++; } } printf("\nMang ban dau -> "); for(i=0;i<10;i++){ printf("%d ",arr[i]); } printf("\nMang chan -> "); for(i=0;i<chan;i++){ printf("%d ",arr_chan[i]); } printf("\nMang le -> "); for(i=0;i<le;i++){ printf("%d ",arr_le[i]); } printf("\n"); }
运行后可以得到预期结果:
Mang ban dau -> 1 2 3 4 5 6 7 8 9 0 Mang chan -> 2 4 6 8 0 Mang le -> 1 3 5 7 9
内容的提问来源于stack exchange,提问作者WanderingShama
相关产品推荐
相关产品推荐

