标签:
项目成员:姜中希、王昭博。
1.设计思想:
(1) 外层while循环控制结束(i=n)的时候停止。
(2) 内层计算:按照不循环数组的方式计算,每当外层i增加1,数组更新,第i-1个数变为数组的第n个数,
第i个数变为数组的第一个数,并进行最大子数组的和的求解。并将最大子数组的开头位置坐标记录入一个数组中,
每次计算的最大和也存入一个数组中,最后进行比较得到最大和以及和最大子的数组的开头位置坐标。
2.实现代码:
//2015/4/4 #include<iostream> using namespace std; void max(int l,int *a)//当元素不全为负数的情况 { int sum=0,j,p; for(int m=0;m<l;m++)//控制首元素是那一个 { p=0; for(int i=m;i<l+m;i++)//控制比较的数组大小始终为l { if(p<0) { p=a[i]; } else { p=p+a[i]; } if(sum<p) { sum=p; j=i; //记录下当前最大子数组的最后一个元素的坐标 } } } cout<<"最大子数组的和为:"<<sum<<endl; cout<<"最大子数组的元素位置为(从后往前输出):"<<endl; p=0,sum=0; int flag; for(int i=j-l+1;i<=j;i++) { if(a[i]>0) { flag=i; break; } } for(int i=j;i>=flag;i--)//从最后元素一个往前找寻找范围是l结果是从j到j-l+1范围内最大子数组的所有元素的下标 { if(p<0) { p=a[i]; } else { p=p+a[i]; cout<<i%l+1<<" "; } if(sum<p) { sum=p; } } } void main() { int n,count=0,mx; cout<<"请输入数组的长度:"; cin>>n; int *a=new int[2*n];//申请一个动态数组数组的长度为2n cout<<"请输入数组元素:"; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]<0) { count++; } } if(count==n)//当数组元素全是负数的情况只需比较单个元素的大小并记下坐标 { mx=a[0]; int c=0; for(int i=1;i<n;i++) { if(a[i]>mx) { mx=a[i]; c=i; } } cout<<"最大子数组的和为:"<<mx<<endl; cout<<"最大和子数组的位置是:"<<c+1<<endl; } else { for(int i=n;i<2*n-1;i++) { a[i]=a[i-n];//将输入的数组元素在此数组中存放两边但第二遍不用存在 一个因为用不着从而成为环 } for(int i=0;i<2*n-1;i++) { cout<<a[i]<<" "; } max(n,a); } }
3.结果截图:
心得总结:
在这次结对开发过程中,我发现虽然我能尽快的找到一些思路,但是我的转化能力欠缺了一些,不能很好的将思路转化为代码;这也让我意识到团队的力量,团队的力量可以让进程更加快速(虽然我也知道这需要互相配合得很好)。每个人都有自己擅长的一方面,我听过一句话,“世界上没有最完美的人,但世界上有完美的团队。”所以我会努力发展自己的长处(尽管我还没找到),在团队里发挥自己的作用。
标签:
原文地址:http://www.cnblogs.com/yuntianblog/p/4429033.html