一 题目要求(合并题目)
1 要求程序必须能处理1000 个元素;
2 每个元素是int32 类型的;
3 输入一个整形数组,数组里有正数也有负数。
4 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
5 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
6 同时返回最大子数组的位置。
7 求所有子数组的和的最大值。要求时间复杂度为O(n)。
二 设计思想
将数组和设置为了auto型变量,和的类型会得到调整,避免了输出的溢出问题;而数组允许首尾相连和最大的情况,可以将for循环语句的出口设置为两倍的数组长度和buffer累加不超过数组长度来得到可靠值
三 源代码
#include<iostream> #include<time.h> #include<conio.h> #define N 100000 using namespace std; void RandIn(int IntNum,int A[])//随机生成IntNum个正负数输出五列 { cout<<"整数内容"<<endl; for(int i=0;i<IntNum;i++) { A[i]=rand()-rand(); cout<<A[i]; if(i%5==4) cout<<endl; else cout<<' '; } } void SelMax(int IntNum,int A[],auto &sum) { auto buffer=0;//引入一个常量记录累加的和 int count1=0;//buffer进行求和的数值个数 int count2=0;//for语句进行的运算次数 for(int j=0;j<=IntNum;j++) { if(j==IntNum) { j=0; } buffer+=A[j]; count1++; count2++; if(buffer<0)//如果累加和小于0,buffer重新初始化为0 { buffer=0; count1=0; } if(sum<buffer)//sum始终记录下存在的最大和 { sum=buffer; } if(count1>IntNum||count2>IntNum*2)//如果累加数count1超过IntNum跳出循环,或者语句进行的运算次数超出数组数值的两倍 { break; } } } void main() { int IntNum; int A[N]; int q=0; while(q==0) { auto sum=0; srand((unsigned)time(NULL)); cout<<"请输入整数的个数:"; cin>>IntNum; RandIn(IntNum,A); SelMax(IntNum,A,sum); cout<<endl; cout<<sum<<endl; cout<<"是否继续测试(输入0则继续否则停止)"; cin>>q; system("cls"); } }
四 程序截图
五 结对照片
六 实验总结
本次试验进一步加深了对数组的认识,由于只是对前面程序的改善,收获并没有那么多,后面会进行更多的尝试