数组前三大数及位置查找程序问题:后两个位置值始终为0
问题分析与修复方案
嘿,我来帮你定位代码里的问题啦~你的程序出现最后两个数位置始终为0的情况,主要是两个核心问题导致的:
1. 初始值设置不合理
你把first、second、third初始为0,idx2、idx3初始为0,这会带来两个问题:
- 如果数组里的元素全部小于等于0,你的逻辑完全不会更新这些变量,最终输出全是0,完全不符合预期;
- 就算数组里有正数,但如果只有1个或2个元素比0大,剩下的变量会保留初始值(比如数组是
[5,3,-1],third还是0,idx3还是0),这显然不是数组里的第三大数。
2. 位置索引的同步更新逻辑缺失
当你遇到比first更大的元素时,只更新了idx1,但没有同步更新idx2和idx3!比如原来first=5(idx1=0)、second=3(idx2=1),现在来了一个6,你把third=second、second=first、first=6,但此时idx2应该改成原来的idx1(0),idx3应该改成原来的idx2(1),你漏掉了这一步,导致位置索引没有跟着数值一起“移位”。
修复后的代码
#include <stdio.h> int main(){ int idx1 = 0; int idx2 = 0; int idx3 = 0; int first, second, third; int num; int array[1000]; printf("Print the number of numbers: "); scanf("%d", &num); printf("Print your numbers: "); // 先用数组第一个元素初始化,避免初始值不匹配问题 scanf("%d", &array[0]); first = array[0]; second = first; third = first; // 从第二个元素开始遍历 for(int i = 1; i < num; i++){ scanf("%d", &array[i]); if(array[i] > first){ // 先把第三、第二的数值和索引往后移 third = second; idx3 = idx2; second = first; idx2 = idx1; // 更新第一的数值和索引 first = array[i]; idx1 = i; }else if(array[i] > second){ // 把第二的数值和索引移给第三 third = second; idx3 = idx2; // 更新第二的数值和索引 second = array[i]; idx2 = i; }else if(array[i] > third){ // 直接更新第三的数值和索引 third = array[i]; idx3 = i; } } printf("Top 3 numbers: %d %d %d\n", first, second, third); printf("Their indices: %d %d %d", idx1, idx2, idx3); return 0; }
修复说明
- 初始化优化:用数组的第一个元素来初始化
first、second、third以及对应的索引,确保初始值和数组元素的范围一致; - 索引同步更新:每次更新更大的数值时,同步把旧的数值对应的索引也往后“移位”,比如新元素超过
first时,原来的first变成新的second,对应的idx1也变成新的idx2,以此类推; - 遍历起始位置调整:因为第一个元素已经用来初始化了,所以从索引1开始遍历数组,避免重复处理第一个元素。
你可以测试一下这个版本,比如输入数组[10,5,8,3,12],会输出Top 3 numbers: 12 10 8和Their indices: 4 0 2,完全符合预期~
内容的提问来源于stack exchange,提问作者janegodna
相关产品推荐
相关产品推荐

