新情况: 要求数组从文件读取。 如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。 另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。
源代码:
package test; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Random; import java.util.Scanner; public class The_second_test { public static void main(String[] args) throws IOException { /** * 数据定义 */ double a[] = new double[50000000]; double b[] = new double[50000000]; // 用于储存子数组的最大值 /** * 文本数据写入 */ FileWriter fs = new FileWriter("D:\test.txt"); try { Random random = new Random(System.currentTimeMillis()); for(int i=0;i<30000000;i++) { int as = random.nextInt(1000)+1; fs.write(as+" "); } } catch (IOException e) { e.printStackTrace(); } finally { if(fs!=null) fs.close(); } /** * 文本数据导入 */ try (Scanner scanner = new Scanner(new BufferedReader(new FileReader( "D:\test.txt")));) { int n=0; scanner.useDelimiter("[?|,|。|' ']"); while (scanner.hasNext()) { double s = Double.parseDouble(scanner.next()); a[n]=s; n++; System.out.println(s); if(n>=200000000) { System.out.println("数据量过大!请重新设置一个小200000个的数组"); System.exit(0); } } } catch (FileNotFoundException e) { System.out.println("文件打开失败"); e.printStackTrace(); System.exit(0); } b[0] = a[0]; /** * 统计所有以一开头的子数组 */ for (int i = 1; i < a.length; i++) { b[i] = b[i - 1] + a[i]; } double max = b[0]; int mas, mis; mas = mis = 0; double min = b[0]; /** * 比较这些子数组里的最大值和最小值 */ for (int i = 1; i < b.length; i++) { if (max < b[i]) { max = b[i]; mas = i; } if (min > b[i]) { min = b[i]; mis = i; } } /** * 判断最小子数组的成员个数是否大于最大子数组的成员个数 */ if (mis > mas) { min = b[0]; mis=0; for (int i = 0; i <= mas; i++) { if (min > b[i]) { min = b[i]; mis=i; } } } /** * 判断最小子数组的和值是否小于零 */ if(mis!=0) { if (min <= 0) System.out.println("最大子数组的值为" + (max - min)); else System.out.println("最大子数组的值为" + max); }else System.out.println("最大子数组的值为" + max); } }