【发布时间】:2021-12-13 02:58:36
【问题描述】:
基本上,我试图制作一个循环遍历给定数组的程序,并检查右侧元素是否比左侧元素大 2 倍,如果为 true,则在中间插入这两个元素的平均值。之后,它打印出插入元素的数组,然后再次循环遍历数组,计算某个数字出现的次数。我用笔和纸成功地编写了所有代码,并将问题写成更小的块,然后用 C 进行编码,但问题是当我输入 100 个零(一百个零)时。程序打印出数字 0 重复了 200 次而不是 199 次。我不知道为什么。对不起,代码很糟糕,我目前的任务是擅长用纸笔解决问题,等我变得体面并发展我的逻辑之后,我会尝试让代码更简单。
Input sample:
Enter the number of elements: 100
Enter the array: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
After adding middle element: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002.33412e-310
The number is repeated 200 time/s
我的代码
#include <math.h>
#include <stdio.h>
#define EPSILON 0.0001
int main() {
int n, i, j, k, digit, length = 0, digit_array[10] = {0};
double array[200], 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]);
for (i = 0; i < length; i++) {
temp = array[i] + array[i];
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]);
for (i = 0; i < length; i++) {
temp = array[i];
digit = ((int)(temp * 10)) % 10;
digit_array[digit]++;
}
printf("\n");
for (i = 0; i < 10; i++) {
if (digit_array[i] != 0)
printf("Number %d is repeated %d time/s.\n", i, digit_array[i]);
}
return 0;
}
【问题讨论】:
-
我希望这可以解释为什么链表在中间插入比数组更好。
-
@yano 我还在学C,想先熟悉一下数组。
-
代码超出了数组的末尾。在循环的最后一次迭代中,
i等于length-1。这意味着表达式temp - array[i+1]正在读取array[length],但array[length]超出了数组的末尾。 -
尚未完全审查代码,但
for (i = 0; i < length-1; i++)可能会工作。 -
@user3386109 对我来说是正确的:godbolt.org/z/j1sPcGc6x