import java.util.Scanner; public class shuzu {//最大的括号 public shuzu() { // TODO Auto-generated constructor stub } public static void main(String[] args) {//1 int max=0;int sum=0; Scanner scanner=new Scanner(System.in); System.out.println("输入数组长度"); int n=scanner.nextInt(); System.out.println(n); System.out.println("输入一个数组"); int A[]=new int [n]; int B[]=new int [n]; int C[]=new int [n]; for(int i=0;i<n;i++)//这一步之前都是把数组输入 {A[i]=scanner.nextInt();} if(A.length==0) {max=0;System.out.println(max);} else if(A.length==1) {max=A[0]; System.out.println(max);}//这里是把数组长度为0和为1的情况算进去了 else {//2 for(int k=0;k<n;k++) {//3 /*System.out.println("第"); System.out.println("("+k+")"); System.out.println("次计算的加和"); System.out.println(C[k]);*/ for(int i=k,a=0;i<n;i++) { a=a+A[i]; B[i]=a; }//使得B数组n个从一开始的子数组 C[k]=B[0]; for(int i=k;i<n;i++) {/*System.out.println("第"); System.out.println("("+k+")"); System.out.println("次计算的加和"); System.out.println(C[k]);*/ if(B[i]>C[k]) C[k]=B[i]; } /*System.out.println("第"); System.out.println("("+k+")"); System.out.println("次计算的加和"); System.out.println(C[k]);*/ }//3排序使得B中的最大值为c【n】,从一开始是c【1】; }//2 max=C[0]; for(int i=1;i<n;i++) { if(C[i]>max) {max=C[i];} /*System.out.println("第"); System.out.println("("+k+")"); System.out.println("次计算的加和"); System.out.println(C[k]);*/ //System.out.println(max);用这个来查看计算结果 } System.out.println(max); }//1 }//最大的括号
代码如上
我的思想大概就是这样吧,分部的第一步基本上就是这样的:首先要完成对数据的处理,就是每次都把最大子数组找出来。但我发现,我所写的程序很不适合我来进行类似的处理。我的方式是先把数组从头加到尾,这样保障数组可以覆盖所有的值。创造一个数组A来储存数据,然后用B数组进行存储这一部分的和,然后把从某个数开始的数组和进行比较,然后把值付给c数组。最后比较数组c,求出最大值就可以了。这样来进行上述的最大值求取就有一些困难,因为我把数组做的非常的分散。不适合
进行分步处理。
如果能确定它在哪一个循环里面输出就行了。不过和我开始怀疑我的程序是错的(就是最初那个版本,因为按逻辑只改一个输出的话不应如此)以下是输出截图:
这样的结果,改了很多地方,把输出位置换了几次,结果都不对。
哎,感觉应该是这个程序本身就有问题吧,亦或是我学艺不精。