You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组插入平均值后0的计数多1次问题排查

问题原因与修复方案

核心问题定位

  • 插入逻辑存在数组越界访问:你的插入遍历循环写的是for (i = 0; i < length; i++),但判断条件中访问了array[i+1],当i等于length-1(也就是当前数组最后一个元素的下标)时,i+1已经超出了数组的有效范围,读取的是栈上未初始化的垃圾值(你输出末尾出现的2.33412e-310就是这个垃圾值)。
    当输入全0时,这个垃圾值如果刚好和0的差值小于你定义的EPSILON,就会触发额外的插入操作,导致数组长度从预期的199变成200,最终统计0的出现次数就多了1次,得到200的错误结果。
  • 统计逻辑不符合设计需求:你当前的统计代码digit = ((int)(temp * 10)) % 10实际统计的是每个数值小数点后第一位的数字,而非数值本身的出现次数,和你描述的「统计各数字的出现次数」需求不匹配。
  • 输入读取存在潜在问题:你给出的输入示例是连续的100个0,用%lf循环读取时,连续的数字会被识别为单个浮点数,导致后续99次scanf阻塞等待输入。如果要读取100个独立的0,输入时需要用空格/换行分隔每个输入值。

修复代码

#include <math.h>
#include <stdio.h>

#define EPSILON 0.0001

int main() {
  int n, i, j, length = 0, count_0 = 0;
  // 扩大数组容量,避免插入后越界
  double array[300], temp;
  do {
    printf("Enter number of elements: ");
    scanf("%d", &n);
  } while (n <= 0 || n >= 101);

  printf("Enter elements: ");
  length = n;
  for (i = 0; i < length; i++)
    scanf("%lf", &array[i]);

  // 修复循环条件,保证i+1是有效元素
  for (i = 0; i < length - 1; i++) {
    temp = array[i] * 2;
    if (fabs(temp - array[i + 1]) < EPSILON) {
      for (j = length; j > i + 1; j--)
        array[j] = array[j - 1];
      array[i + 1] = (array[i] + array[i + 1]) / 2.;
      // 跳过新插入的元素,避免重复判断
      i++;
      length++;
    }
  }

  printf("After adding middle element: \n");
  for (i = 0; i < length; i++)
    printf("%g ", array[i]);

  printf("\n");
  // 示例统计逻辑:统计0的出现次数,可按需扩展统计其他数值
  for (i = 0; i < length; i++) {
    if (fabs(array[i] - 0) < EPSILON) {
      count_0++;
    }
  }
  printf("Number 0 is repeated %d time/s.\n", count_0);

  return 0;
}

内容的提问来源于stack exchange,提问作者casual

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:45:08