#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int _tmain(int argc, _TCHAR* argv[])
{
int x[3][3] = {0};
int sum = 0;
int max = 0;
int i = 0;
int j = 0;
//赋值
for (i = 0; i<3; i++)
{
for (j = 0; j<3;j++)
{
x[i][j] = rand()%20-10;
printf("%d\t",x[i][j] );
}
}
//循环
int M = x[0][0];
for (i = 0; i<3; i++)
{
int y = i;
do
{
for (j = 0; j<3; j++)
{
for (int u = i; u >= y; u--)
{
sum =sum+ x[j][u];
//printf("\t%d", u);
}
max = max + sum;
if (max >= M)
{
M =max;
}
if (max<0)
{
max = 0;
}
sum = 0;
}
y--;
max = 0;
} while (y >= 0);
}
printf("\n连续最大子数组之和:");
printf("%d\n", M);
return 0;
}
其实刚开始的时候思路还是上次一维数组连续最大子数组求和时的思路,用两个数组分别存最大和和当前的和,区别是二维数组的话需要在一行完结时进行处理,判断第一行之和是否为正数,否则两个数组归零重新累加判断,所谓思路就还是连续相加把最大和放入max然后用new比较将更大的和放入max,最后输出.我认为自己思路是正确的,但用c语言的时候遇到了一些问题,比如怎么把二维数组随机出的具体值直接运算,但始终解决不了具体的循环的问题,之后我们就在网上查找去看其他人的方法,有很多,但其中找到了一个和我们思路相同的前辈的语句,不得不说我们确实忽视了do while 的运用和具体如何实现循环的问题,简洁直接能切中要害确实是需要学习和改进的地方.
这次思考是上一次的延伸,不过也确实感觉到软件工程这门课越来越难,这次程序代码不多,但写出来不容易,编程得要好好动脑子才可以.