设计思想:通过把数组的长度扩大为原来的一倍,相当于新数组是由对原来的数组重复了一遍后而组成的,这样保证了数组以环状的形式,按照数组中每个数字的位序依次对它们可能形成的最大子数组依次进行比较,这样保证了能够始终记录每次最大子数组的位置,以便随着程序的进行不断更新直至得到最终的最大子数组之和以及最大子数组的下标。
源代码:
//求一个一维环形数组的最大子数组之和,并要求返回组成最大子数组的下标 //李敏,Apr 12th #include<iostream> #include <time.h> using namespace std; void main() { int a[100],i,j,m,b,c,maxsum,k=0,t=0,l; cout<<"输入数组长度:"<<endl; cin>>m; cout<<"输入数组范围,第一个数作为上限,第二个数作为下限:"<<endl; cin>>b>>c; //检测输入数组长度的合法性 if(m==0||m<0||m>50||m>c-b) { cout<<"输入的数组长度不合法,请重新输入!"<<endl; cin>>m; } //检测输入数组范围的合法性 if(b>c||(b<-2147483648||b==-2147483648)||c==2147483647) { cout<<"输入的数字不合法,请重新输入:"<<endl; cin>>b>>c; } cout<<"产生的随机数为:"<<endl; srand( (unsigned)time( NULL ) ); //扩大数组长度为2*m for(i=0;i<m;i++) { a[i]=b+rand()%(c-b+1); a[m+i]=a[i]; cout<<a[i]<<‘\t‘; } maxsum=a[0]; //依次按顺序比较由各个序位组成的最大子数组之和,且取出最大子数组之和以及最大子数组的位置 for(i=0;i<m;i++) { int sum=a[i]; for(j=i+1;j<i+m;j++) { sum+= a[j]; if(sum>maxsum) { maxsum=sum; k=i; t=j; } } } cout<<"最大子数组之和为:"<<maxsum<<endl; cout<<"连续的最大子数组对应的下标依次为:"<<endl; //依次输出环形数组中组成最大子数组的各个数的位序下标 for(l=k;l<t+1;l++) { if(l>m||l==m) { cout<<l%m<<‘\t‘; } else { cout<<l<<‘\t‘; } } }
实验截图:
编程总结:通过此实验又再一次增进了我们的合作氛围,增强了我们的团队意识,还有让我再一次意识到了团队开发的重要性,每一次的角色互换使我们可以感受不同的角色所带来的成果享受以及互相取长补短,综合意见,各自发挥自己的优势,同时及时的查询资料也是必要的,这样可以提高自己的专业知识以及开拓思维!
团队合作人:李敏 刘子晗
工作照:
时间: 2024-10-12 16:21:04