题目:返回一个一维整数数组中最大子数组的和。
要求:
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
此次何琳琳负责程序分析,代码编程,张一博负责代码复审和代码测试计划。
经分析讨论设计思路如下:
设计思路:
1、定义一个长为20的数组,先对前10个数进行初始化,后10个数等于前10个数;
2、设置长度为10的循环依次以前十个数为头进行最大子数组的计算;
3,再设置一个数组用来存储每次循环产生的最大子数组和;然后取最大值
4、输出最大值
源代码:
1 //import java.util.Random; 2 //import java.util.Scanner; 3 import java.util.*; 4 public class Test { 5 6 public static void main(String[] args) { 7 // TODO 自动生成的方法存根 8 int []shuzu=new int[20]; 9 int []max=new int[10]; 10 int i,sum=0; 11 //初始化数组 12 for(i=0;i<10;i++) 13 { 14 System.out.println("请输入第"+(i+1)+"个值"); 15 Scanner input=new Scanner(System.in); 16 shuzu[i]=input.nextInt(); 17 } 18 for(i=10;i<20;i++) 19 { 20 shuzu[i]=shuzu[i-10]; 21 } 22 int w=0; 23 for(int x=0;x<10;x++) 24 { 25 sum=shuzu[x]; 26 for(i=x;i<(x+10);i++) 27 { 28 if(w<0) 29 { 30 w=shuzu[i]; 31 } 32 else 33 { 34 w+=shuzu[i]; 35 } 36 if(sum<w) 37 { 38 sum=w; 39 } 40 } 41 w=0; 42 max[x]=sum; 43 System.out.println("各个子数组的最大子数组和为:"); 44 System.out.println(max[x]); 45 } 46 int max1=max[0]; 47 for(int q=0;q<10;q++) 48 { 49 if(max[q]>max1) 50 { 51 max1=max[q]; 52 } 53 } 54 System.out.println("最大子数组和为"+max1); 55 56 } 57 }
结果截图:
结果分析:w作为求和的中介,在每次不同首项求最大子数组和完毕后,必须初始化为0,不然会发生和的叠加。