结对开发---环
(1)源代码:
1 package ruanjian; 2 3 import java.util.Random; 4 import java.util.Scanner; 5 6 public class test3 { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 int N=20; 11 int n=-20; 12 int m=20; 13 int a[]=new int[N]; 14 15 Input(a,N,n,m); //随机产生a[N] 16 System.out.println("数组a[N]为:"); 17 for(int i=0;i<N;i++) //输出数组a[N] 18 { 19 System.out.print(a[i]+" "); 20 } 21 System.out.println(); 22 23 int H[]={a[0],0,0}; 24 for(int i=1;i<=N;i++) //求最大子数组和 25 { 26 array(a,N); 27 Maxarray(H,3,a,N,i); 28 } 29 30 System.out.println("最大子数组为:"); 31 if(H[1]>H[2]) 32 { 33 for(int i=H[1];i<N;i++) 34 { 35 System.out.print("a["+i+"] "); 36 } 37 for(int i=0;i<=H[2];i++) 38 { 39 System.out.print("a["+i+"] "); 40 } 41 } 42 else if(H[1]==H[2]) 43 { 44 System.out.print("a["+H[1]+"] "); 45 } 46 else 47 { 48 for(int i=H[1];i<=H[2];i++) 49 { 50 System.out.print("a["+i+"] "); 51 } 52 } 53 System.out.println(); 54 System.out.println("最大子数组和为:"+H[0]); 55 56 } 57 58 static void Input(int a[],int N,int n,int m) //随机产生数组a[N] 59 { 60 for(int i=0;i<N;i++) 61 { 62 a[i]=(int)(n+Math.random()*(m-n+1)); 63 } 64 } 65 66 static void array(int a[],int N) //把数组第一个数放到最后,重新排列数组 67 { 68 int q=a[0]; 69 for(int i=0;i<N-1;i++) 70 { 71 a[i]=a[i+1]; 72 } 73 a[N-1]=q; 74 } 75 76 static void Maxarray(int H[],int L,int a[],int N,int m) //对数组求最大子数组,并记录它的最大子数组和,和数组的起始位置 77 { 78 int Max=a[0]; 79 int A=a[0]; 80 int b=0; 81 int c=0; 82 int d=0; 83 for(int i=1;i<N;i++) 84 { 85 if(A<0) 86 { 87 A=a[i]; 88 if(Max<A) 89 { 90 Max=A; 91 b=i; 92 c=i; 93 d=b; 94 } 95 else 96 { 97 b=i; 98 } 99 } 100 else 101 { 102 if(a[i]<0) 103 { 104 if(Max<A) 105 { 106 Max=A; 107 c=i-1; 108 d=b; 109 } 110 A=A+a[i]; 111 } 112 else 113 { 114 A=A+a[i]; 115 if(Max<A) 116 { 117 Max=A; 118 c=i; 119 d=b; 120 } 121 } 122 } 123 } 124 if(H[0]<=Max) 125 { 126 H[0]=Max; 127 if((d+m)<N) 128 { 129 H[1]=d+m; 130 } 131 else 132 { 133 H[1]=d+m-N; 134 } 135 if((c+m)<N) 136 { 137 H[2]=c+m; 138 } 139 else 140 { 141 H[2]=c+m-N; 142 } 143 } 144 } 145 }
(2)截图:
(3)设计思路:
一维数组环型求最大值,先按一维数组的设计思路,逐个相加,当和为负数时从后面数组重新开始计算,此次每次求出值后将第一个值移至最后一个值,重新再计算一次求最大值,并与之前值比较并记录,利用调用函数。因为题目要求数组首尾相邻,允许输出A[i-1]...A[n-1],A[0]...A[j-1]之和最大,所以定义了一个n为数组,(1)从第二个整数开始到第n个整数依次向前移一位,原来第一位的整数放到最后一位,形成新的数组,(2)求新数组的最大子数组和,然后重复(1)直至循环n次,最后一个数组与初始数组相等。求最大子数组和的方法为:从第一个数(判断第一个数的正负,若负舍去,看下一个数,若正继续)开始把数组(没加一个数,都要对此数判断正负,若负,把之前的值当作最大值储存起来,再继续,若正,继续 )相加,每加一个数对和进行判断,如果小于零,抛弃当前值,如果大于零,下一个数与零比较,小于零时,先将最大值与之前的和比较,在让和加上这个数,如果大于零,直接让和加上这个数,再取最大值和和之间的最大值。(未完成时间复杂度为O(n)的要求)。
(4)结对开发:
在本次结对开发中,互换角色,我负责对程序的测试,王欣欣负责对程序的编程。
(5)合作照: