第一种算法(很麻烦)
设计思想:
1.通过随机数产生十个数。
2.声明一些变量,包括:
flag —— 用来控制子数组的长度,从一到十递增。
sum —— 记录最大子数组的和,初始值为a[0]。
s_temp —— 记录不断更新的子数组的和。
3.通过一个while语句和两个for循环实现。需注意第二个for循环中,为防止数组越界,使用Math.min方法。
源代码:
int a[] = new int[10]; for(int i = 0;i < 10;i++){ a[i] = (int)(Math.random() * 20 - 10); // 产生的随机数范围在-9 ~ 9 } System.out.print("产生的随机数的值为:"); for(int i = 0;i <10;i++){ System.out.print(a[i] + " "); } System.out.print(" "); int sum = a[0],s_temp = 0,flag = 1; while(flag < 10){ for(int j = 0;j < 10;j++){ s_temp = 0; for(int k = j;k < Math.min(j+flag,10);k++){ s_temp = s_temp + a[k]; } if(s_temp > sum){ sum = s_temp; } } flag++; } System.out.println("最大子数组的和为:" + sum); }
运行结果:
第二种方法:
设计思想:
当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。所以,当接下来的和使现在的和更小时,抛弃它。当目前的和大于最大值,更新最大值。
源代码:
1 int a[] = new int[10]; 2 for(int i = 0;i < 10;i++){ 3 a[i] = (int)(Math.random() * 20 - 10); // 产生的随机数范围在-9 ~ 9 4 } 5 System.out.print("产生的随机数的值为:"); 6 for(int i = 0;i <10;i++){ 7 System.out.print(a[i] + " "); 8 } 9 System.out.print(" "); 10 int sum = a[0],s_temp = a[0]; 11 for(int i = 1 ;i < 10;i++){ 12 s_temp = s_temp + a[i]; 13 if(s_temp < a[i]){ 14 s_temp = a[i];16 } 17 if(s_temp > sum){ 18 sum = s_temp;21 } 22 } 23 24 System.out.println("最大子数组的和为:" + sum);