📜  门| Gate IT 2007 |第31章

📅  最后修改于: 2021-06-29 03:19:28             🧑  作者: Mango

考虑下面给出的C程序:

#include 
int main ()    {
    int sum = 0, maxsum = 0,  i,  n = 6;
    int a [] = {2, -2, -1, 3, 4, 2};
    for (i = 0; i < n; i++)    {
            if (i == 0 || a [i]  < 0  || a [i] < a [i - 1])  {
                     if (sum > maxsum) maxsum = sum;
                     sum = (a [i] > 0) ? a [i] : 0;
            }
            else sum += a [i];
    }
    if (sum > maxsum) maxsum = sum ;
    printf ("%d\n", maxsum);
  
} 

执行该程序时输出的值是多少?
(A) 9
(B) 8
(C) 7
(D) 6答案: (C)
说明:如果仔细寻找循环,您会注意到它在if条件中将sum变量分配给某个值,并在else条件中将其递增。进一步考虑,很明显,此循环在sum变量中存储正整数的递增子序列之和,并在maxsum中存储sum的最大值。因此,在执行该程序时,将打印出maxsum –正整数递增子序列的最大和,即3 + 4 = 7。

此解决方案由Vineet Purswani提供

//输出将为3 + 4 = 7 {for ||如果第一个参数为true,则不会计算第二个参数,如果第一个参数为false,则将计算第二个参数}

另一种解决方案

当我= 1

-> i == 0为假,但a [i] maxsum)为true,因为sum = 2并且maxsum = 0。所以maxsum = 2。 sum =(a [i]> 0)? a [i]:0; ,sum = 0,因为a [i] <0。

当我= 2

-> i == 0为假,a [i] maxsum)为假,因为sum = 0和maxsum = 2。因为sum =(a [i]> 0)? a [i]:0; ,sum = 0,因为a [i] <0。

当我= 3

-> i == 0为假,a [i] <0为假,[i]

当我= 4

-> i == 0为假,a [i] <0为假,[i]

当我= 5

-> i == 0是false,a [i] <0是false,并且[i] maxsum是true,因为sum = 7和maxsum = 2,所以maxsum = 7。

(a [i]> 0)? a [i]:0,因为a [5]> 0,所以sum = 2。

该解决方案由Nirmal Bharadwaj贡献
这个问题的测验