C是阵列中连续3个数的最大总和

时间:2015-11-01 18:17:40

标签: c arrays numbers sum

我正在学习C,我的老师给了我一个任务,但我被困了。 在数组中有10个正数,我需要找到具有最高总和的3个连续数字。我在网上找到了这个解决方案,但是如何找到3个连续数字并求它们呢?我该怎么做呢?我应该在数组中查找最大数字并从那里开始吗? 我发现的代码在我到目前为止做得更好。

数组有:{1,2,3,2,0,5,1,6,0,1}然后3个数字的最大总和为{1,2,3,2,0, 5,1,6 ,0,1},因为它给出12

#define N_ELEMENTS 10

int main(int argc, const char * argv[]) {

    int a[N_ELEMENTS] = {1, 2, 3, 2, 0, 5, 1, 6, 0, 1};
    int i = 0;
    while(a[i] < 0 && i<N_ELEMENTS) {
        i++;
    }
    if (a[i] < 0) {
        printf ("DEBUG: array with only negative numbers. Print the smallest negative number as the sum and we are done.\n");
    }
    int sum_p=0, sum_n = 0;
    int largest_sum = 0;
    while (i<N_ELEMENTS) {
        if (a[i] > 0) {
            sum_p += a[i];
        }
        else {
            sum_n += a[i];
        }
        if (sum_p+sum_n > largest_sum) {
            largest_sum = sum_p + sum_n;
        }
        if (sum_p+sum_n <= 0) {
            // find the next positive number
            while(a[i] < 0 && i<N_ELEMENTS) {
                i++;
            }
            if (a[i] < 0 || i == N_ELEMENTS) {
                break;
            }
            sum_p = 0;
            sum_n = 0;
        } else {
            i++;
        }
    }
    printf ("DEBUG: The largest consecutive sum = %d\n", largest_sum);
}

2 个答案:

答案 0 :(得分:5)

你应该做的是尝试每一个可能的连续三个数字并从中选择最好的数字 类似的东西

int sum = 0;
int idx = 0
for(int i=0;i<size-2;i++){
    if (A[i]+A[i+1]+A[i+2] > sum){
        sum = A[i] + A[i+1] + A[i+2];
        idx = i;
    }
}

答案是A [idx],A [idx + 1],A [idx + 2]

答案 1 :(得分:1)

你需要的只是滚动总和。一个推拉窗。您可以在O(n)中线性扫描。

减去刚刚滑出窗口的数字并添加到达的新号码。跟踪最大的金额。

1, 2, 3, 2, ...
-------        sum is 6
   --------    sum is 6 - 1 + 2 = 7 (biggest sum.. so far)
      -------  ...