1.设计思想
只用一个主函数即可完成。
首先,定义一个整型数组,让用户输入一组整数。
然后,判断这一组数的正负还有零的情况。
最后,根据判断出来的情况进行选择执行 if 语句,情况分别为全为0,负数和0,正数和0还有正数负数和0。
2.源代码
1 /* 2 * For the maximum of the subarray of an integer array 3 * The start time 2016/4/8 16:50 4 * The end of time 2016/4/8 18:30 5 * Author Jing 6 */ 7 package arraymax; 8 import java.util.*; 9 public class SumArray { 10 11 public static void main(String[] args) { 12 13 Scanner sca=new Scanner(System.in); 14 System.out.println("输入整数数组数的个数"); 15 int num=sca.nextInt(); 16 17 int a[]=new int[num],b[]=new int[num]; 18 int i; 19 System.out.println("输入此组整数数组"); 20 for(i=0;i<num;i++) 21 { 22 a[i]=sca.nextInt(); 23 } 24 int l=0,j=0,k=0,sum=0,max; 25 for(i=0;i<num;i++)//判断输入数组的正负情况 26 { 27 if(a[i]>=0) 28 { 29 j++; 30 } 31 if(a[i]<0) 32 { 33 k++; 34 } 35 if(a[i]==0) 36 { 37 l++; 38 } 39 } 40 if(k==num)//全为负数 41 { 42 max=a[0]; 43 for(i=1;i<num;i++) 44 { 45 if(max<a[i]) 46 { 47 max=a[i]; 48 } 49 } 50 System.out.println("最大子数组和为 "+max); 51 } 52 else if((l+k)==num)//只有负数和0 53 { 54 System.out.println("最大子数组和为 0"); 55 } 56 else if(j==num)//全为非负数 57 { 58 for(i=0;i<num;i++) 59 { 60 sum+=a[i]; 61 } 62 System.out.println("最大子数组和为 "+sum); 63 } 64 else 65 { 66 for(i=0;i<num-1;i++) 67 { 68 if(a[i]>=0&&a[i+1]>=0) 69 { 70 a[i+1]=a[i]+a[i+1]; 71 a[i]=0; 72 } 73 if(a[i]<0&&a[i+1]<0) 74 { 75 a[i+1]=a[i]+a[i+1]; 76 a[i]=0; 77 } 78 } 79 k=0; 80 j=0; 81 while(k<num)//循环完成后b[]中只有正负数 82 { 83 if(a[k]!=0) 84 { 85 b[j]=a[k]; 86 j++; 87 } 88 k++; 89 } 90 if(b[0]<0) //寻找第一个正数的下标 91 { 92 i=1; 93 } 94 else 95 { 96 i=0; 97 } 98 while(i<j-2)//只有正数和负数时进行计算 99 { 100 if(b[i]>(-b[i+1]) && (-b[i+1])<b[i+2]) 101 { 102 b[i+2]=b[i]+b[i+1]+b[i+2]; 103 b[i]=0; 104 b[i+1]=0; 105 i=i+2; 106 } 107 else 108 { 109 i=i+2; 110 } 111 } 112 max=b[0]; 113 for(i=1;i<j;i++) 114 { 115 if(max<b[i]) 116 { 117 max=b[i]; 118 } 119 } 120 System.out.println("最大子数组和为 "+max); 121 } 122 } 123 }
The Main Code
3.结果截图
4.编程总结
由于时间问题,此程序编的有些仓促,还有很多不足之处,以及需要优化的地方。在空余时间里,我再继续思考,争取编出一个最起码自己满意的程序。
时间: 2024-10-10 02:02:37