任务要求: 1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
4、同时返回最大子数组的位置。
5、求所有子数组的和的最大值。
实验思路:
首先分为两种情况,随机数组和自己输入数组,定义数组长度获取-n到n范围内的随机数或输入值。构造一个新数组,新数组是由两遍输入的数组构成,然后按照一维数组的求法求出,加上限制条件,求和时数组的长度必须小于输入数组的个数。
出现问题:
1、在循环过程中把自己绕进去了。
2、最开始对随机数取太多导致运行时间太长。
3、在分析循环数组时遇到麻烦耗费很多时间才理清思路。
实验代码:
#include <iostream> #include<stdlib.h> #include<time.h> using namespace std; int main() { int i,j; int a[10]; int c[19]; int max = 0; int b = 0; srand(time(NULL)); cout<<"数组为:"<<endl; for (i = 0; i<10; i++) { a[i] = rand()%21-10; } for (i = 0; i<10; i++) { cout << a[i] << '\t'; } cout << endl; for (i = 0; i < 10; i++) { c[j]=a[i]; } for (i = 0; i < 9; i++) { c[j+10]=a[i]; } for (j = 0; j < 10; j++) { b += c[j]; if (b < 0) b = 0; if (b > max) max = b; } if (max == 0) { max = c[0]; for (j = 0; j < 19; j++) { if (max < c[j]) { max = c[j]; } } } cout <<"最大子数组为:"<< max << endl; system("pause"); return 0; }
运行结果:
实验总结:
这个程序相对于不循环的数组求最大子数组和的关键是找到算法的限制条件,求和时数组的长度必须小于输入数组的个数。在开始编写程序时对循环结构的选择是一个问题。
队员:侯熙磊 黄睿麒