import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Scanner; public class MaxSubArray { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Scanner in=new Scanner(System.in); int n; System.out.println("输入数组元素个数"); n=in.nextInt(); int []array=new int[n]; System.out.println("输入数组元素"); for(int i=0;i<n;i++) { array[i]=in.nextInt(); } int []doubleArray=new int[2*n]; for(int i=0;i<n;i++) { doubleArray[i]=array[i]; } for(int j=0;j<n;j++) { doubleArray[j+n]=array[j]; } //验证doubleArray在排列上是否为array数组*2 /*for(int m=0;m<2*n;m++) { System.out.print(doubleArray[m]); }*/ //列举所有子数组和 System.out.println("子数组的和为:"); File file=new File("max.txt"); FileWriter fw=new FileWriter(file); int max=0; for(int i=0;i<n;i++) { int flag=0; for(int j=i;j<2*n;j++) { max=max+doubleArray[j]; flag++; System.out.print(max+" "); fw.write(max+" ");//所有子数组的和写入max文件 if(flag==n)//达到数组最大长度跳出循环 break; } max=0;//归零 System.out.println(); } fw.close(); System.out.println(); //读取max文件子数组和并获取最大值 FileReader fr=new FileReader("max.txt"); BufferedReader br=new BufferedReader(fr); int[]GetMax=new int[n*n]; String line; int j = 0; while((line=br.readLine())!=null) { GetMax[j++]=Integer.parseInt(line); } br.close(); int SubMax=GetMax[0]; for(int i=0;i<n*n;i++) { if(GetMax[i]>SubMax) SubMax=GetMax[i]; } System.out.println("子数组和最大值为"+SubMax); } }
设计思路:
DoubleArray数组等于两个Array数组,相当于将Array数组弄成一个掰直的头尾相连的数组。按Array中元素顺序开始向后累加DoubleArray数组的元素,直到达到Array的长度n,生成所有子数组的和。再把这些和写入文件max,用GetMax数组读取max文件中的这些和,最后筛选出最大值,即为最大子数组和。
运行结果截图: