#include<iostream> using namespace std; #define Nu 5 int main() { int a[Nu]={2,-2,4,-6,1}; cout<<"随机产生数组为:"; for(int i=0;i<Nu;i++) cout<<a[i]<<" "; cout<<endl; int sum=a[0],b=a[0],x=0,y=0; int j=1; while((j-x<Nu)&&x<Nu) { if(b>0) { b=a[j%Nu]; if(j<Nu) x=j; else break; } else b+=a[j%Nu]; if(sum>b) { sum=b;y=j;} j++; } cout<<x<<endl<<y<<endl; sum=0; for(int i=y+1;i<x+Nu;i++) sum+=a[i%Nu]; cout<<"相邻子数组最大和为:"<<sum<<endl; cout<<"相应子数组为:"; for(int i=y+1;i<x+Nu;i++) cout<<a[i%Nu]<<" "; cout<<endl; return 0; }
成员:宋雨佳 周雪莹
设计思路:继第一次的首尾相连最大子数组和,这是改进版,因为当1 2 3 -1 2时,-1是不能被舍弃的,所以就反其道而行,求最小的子数组和,余下的便是最大子数组。
后感:还屁颠屁颠的觉得首尾相连简简单单就做完了,在帮同学看程序时发现了自己程序的不足,但是这次程序也不是很完善,全负数和全正数没有考虑,哎呀不想写了!目前还没有举出不符合算法的数组,考虑不完整,以后发现继续完善
时间: 2024-10-24 09:56:33