合作照片:
设计思想:
在原程序的基础上,再加一个循环,循环从最后一位数开始,到它之前的数结束;
可以将最后一位数赋给第一个数,剩下的数依次向前进一位;
计算方法和上次相同,每次循环都加上相邻的数,比较是否小于0,若小于0则将和的值赋为0,从下一位重新开始相加;若大于最初的最大值,则将和的值赋给最大值;
上次程序实现了首尾不连接的最大值,这次循环实现首尾连接的最大值,后再比较两次最大值,返回其中最大的值。
合作过程:
首先,两人在一起对编程题目进行讨论,发表自己的见解,并且对上次的编程进行回顾总结,对上次的思路进行整理,将这次程序进行完善。
源程序代码:
//求数组中子数组和的最大值 import java.util.Scanner; public class Test3{ public static void main(String[] args){ int N=3; int list[]=new int [N]; //创建一个新数组 Scanner in=new Scanner(System.in); int i; System.out.println("请输入数组:"); for(i=0;i<N;i++) { list[i]=in.nextInt(); } max_ l=new max_(); System.out.print("子数组最大的和为: "+l.max_(list,N)); //调用函数 in.close(); } } class max_ { int max_(int list[],int length) { int i; int max; int lmax1=0; int lmax2=0; int max1=list[0]; //设最大值为list[0] for(i=0;i<length;i++) { lmax1+=list[i]; if(lmax1>max1||lmax1==max1) { max1=lmax1; } if(lmax1<0)//若小于0,则从后一个数开始加和 { lmax1=0; if(max1<list[i]||max1==list[i]) { max1=list[i]; } } //若数组全为负数,求最大值 } //实现首尾相接,求最大值 int sum; sum=list[length-1]; for(i=0;i<length-1;i++) { list[i+1]=list[i]; } list[0]=sum; int max2=list[0]; for(i=0;i<length;i++) { lmax2+=list[i]; if(lmax1>max2||lmax1==max2) { max2=lmax2; } if(lmax2<0)//若小于0,则从后一个数开始加和 { lmax2=0; if(max2<list[i]||max2==list[i]) { max2=list[i]; } } //若数组全为负数,求最大值 } if(max1>max2) { max=max1; } else max=max2; return max; } }
结果截图:
总结体会:
两次程序的设计思想是基本相同的,我们只需要在原程序的基础上加一个循环求得首尾连接的最大值,再比较出最大值即可。