返回一个整数数组中最大子数组的和(2)

新情况: 要求数组从文件读取。 如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。 另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。

源代码:

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);
        
    }
}

猜你喜欢

转载自www.cnblogs.com/charles-s/p/12377788.html