考虑下面给出的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贡献
这个问题的测验