新要求:
在“一个整形数组中最大值求和问题(2)”的基础之上,加入了新要求。
将一位数组变成环形数组。
首先在自己看到这道题目的时候,并没有什么思路,然后老师一点一点的旁敲侧击,自己又在纸上动手画了画,最后自己实现了这个项目。值得说明的一点是,自己虽然能够实现,但是当与同学们上台分享时,并没有很好的表达出自己的意思,一方面,自己的语言表达能力还很欠缺,在日后的学习生活中要有意识地去改善这一方面。另一方面,自己地逻辑思维不是很清晰,正如主任所说的那样“这只是一个小小地项目都没能很好的表达出自己,那上百行地大项目,更说不出来,也做不出来了。”自己地逻辑思维能力,也要逐步提高。
设计思想:
环形数组,则程序需要在源程序的基础之上,加入实现最后一个数加开头数地想法,即实现n->(n-1)的计算。
首先在原代码基础之上,加入变量a(用来表示数组的长度,由于数组从0开始表示,故赋初值-1),然后当数组遍历完成一次之后,将已有的sum值与(sum+c[0])、a与数组长度n两两进行比较,两个条件都满足时,才执行,将已有的sum值接着从头开始相加的代码,且每执行一次,均需判断a与数组长度的关系。一但a大于等于数组长度n,则跳出循环,此时的f为子数组和的最大值。
实验截图:
源代码:
import java.util.Scanner; public class sum02 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); System.out.println("请输入数组的长度为:"); int n=sc.nextInt(); int[] c = new int[n]; System.out.println("请输入"+n+"个整数"); for(int i=0;i<n;i++) { c[i] = (int) sc.nextLong(); } int a=-1;//a值用来表示子数组的长度 int f=0;//定义整形变量f,为子数组最大值 int sum=0;//定义整形变量sum,为子数组求和 for(int i=0;i<n;i++) { sum = sum+c[i]; if(sum < 0) { sum=0; } if(sum > f) { f = sum; } a=a+1; } //System.out.println(a); if( a<n && (f+c[0])>f) { for(int i=0;i<n;i++) { sum = sum+c[i]; if(sum < 0) { sum=0; } if(sum > f) { f = sum; } a=a+1; if(a >= n) { break; } } } if(sum == 0) { for(int i=0;i<n;i++) { if(i == 0) { f = c[i]; } if(f < c[i]) { f = c[i]; } } } System.out.println("该数组的子数组之和的最大值为:"+f); } }