数组(一堆数组)程序运行练习


int i, max_sum, n, this_sum; 
int a[ ] = {-1, 3, -2, 4, -6, 1, 6, -1};
scanf("%d", &n);
max_sum = this_sum = 0;
for( i = 0; i < n; i++ ) {
    this_sum += a[i]; 
    if( this_sum > max_sum ) max_sum = this_sum; 
    else if( this_sum < 0 ) this_sum = 0;
}
printf("%d\n", max_sum);

输入8,输出7;
输入5,输出5;为啥呀!我两个都算错了

输入8,难道不是this-sum=-1+。+-1=4,然后max-sum=4 我同理得到输入5,输出0;是哪错了呢?

代码中有一个小错误:

int a[ ] = {-1, 3, -2, 4, -6, 1, 6, -1};
修改为
int a[8] = {-1, 3, -2, 4, -6, 1, 6, -1};

因为数组 a 的大小是 8,但是没有在代码中明确指定。

输入 8,输出 7,是因为代码实际上在计算从数组的第一个元素到第八个元素的最大连续和,即 3 + (-2) + 4 + (-6) + 1 + 6 + (-1) = 7。

输入 5,输出 5,是因为代码实际上在计算从数组的第一个元素到第五个元素的最大连续和,即 3 + (-2) + 4 = 5。

#include <stdio.h>

int main() {
    int i, max_sum, n, this_sum;
    int a[8] = {-1, 3, -2, 4, -6, 1, 6, -1};
    scanf("%d", &n);
    max_sum = this_sum = 0;
    for(i = 0; i < n; i++) {
        this_sum += a[i];
        if(this_sum > max_sum) max_sum = this_sum;
        else if(this_sum < 0) this_sum = 0;
    }
    printf("%d\n", max_sum);
    return 0;
}

if( this_sum > max_sum ) max_sum = this_sum; 
    else if( this_sum < 0 ) this_sum = 0;

这段代码是在循环里面的
每加一个数的结果要去跟max比较,还要看是否小于0,你直接把数都加一起肯定不对呀

应该是因为for循环里面的两行if-else if分支代码的原因:

第一行代码的意思是,当连续和变量this_sum的值大于最大的连续和变量max_sum的值时,将this_sum的值赋值给max_sum;

第二行代码的意思是,当连续和变量this_sum的值小于0时,将this_sum的值设置为0;

所以max_sum的值存储的不是从下标0到n-1下标元素的连续和,而是大于等于0的最大连续和,所以这里会在输入8时,输出7;输入5时,输出5;可以在for循环中,打印各变量的值来观察整个变量的变化过程就能明白代码运行结果的原因了。

测试代码如下:

#include <stdio.h>

int main(void){
    
    int i, max_sum, n, this_sum; 
    int a[ ] = {-1, 3, -2, 4, -6, 1, 6, -1};
    scanf("%d", &n);
    max_sum = this_sum = 0;
    for( i = 0; i < n; i++ ) {
        this_sum += a[i]; 
        if( this_sum > max_sum ) max_sum = this_sum; 
        else if( this_sum < 0 ) this_sum = 0;
        printf("i=%d,a[%d]=%d,this_sum=%d,max_sum=%d\n\n",i,i,a[i],this_sum,max_sum);
    }
    printf("%d\n", max_sum);
} 


img