整数数组中最大子数组的和(第二版)

一、简介

根据上篇博客的内容,题目新加了要求,暂且称为上篇博客的加强版吧

二、新增要求

1、要求数组从文件读取

2、如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出

3、另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃

三、思路

1、使用文件读取(字符流和字节流皆可)

2、使用大数字方法去考虑

3、使用Try-Catch机制捕获错误。

四、源代码

package Test3;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.math.BigInteger;

    public class Fileduxie {

        @SuppressWarnings("resource") 
        public static void main(String[] args) throws IOException {
            String line = "";
            String snum[] = new String[100];
            //设置num.txt中一行10个数据
            String sp[] = new String[10];
            File file = new File("num.txt");
            BufferedReader br = null;
            try {
                br = new BufferedReader(new FileReader(file));
            } catch (FileNotFoundException e) {
                System.out.println("文件位置错误");
                return;
            }
            int temp = 0;
            int k = 0;
            int i = 0;
            BigInteger big[] = new BigInteger[100];
            BigInteger big2[] = new BigInteger[100];
            BigInteger bigmax = new BigInteger("-9999999999");
            BigInteger bigmax2 = new BigInteger("0");
            BigInteger bigmin = new BigInteger("9999999999");
            BigInteger bigsum = new BigInteger("0");
            // 使用BigInteger读文件按行读取文件
            while ((line = br.readLine()) != null) {
                // 按空格进行分割函数
                sp = line.split(" ");
                for (i = 0; i < sp.length; i++) {
                    snum[temp] = sp[i];
                    temp++;
                }
            }
            // 数据转换
            try {
                // 转化为BigInteger
                for (i = 0; i < snum.length; i++) {
                    if (snum[i] != null) {
                        big[i] = new BigInteger(snum[i]);
                        big2[i] = big[i];
                        //System.out.println(big[i]);
                        bigsum = bigsum.add(big[i]);
                    }
                }
            } catch (NumberFormatException e) { 
                System.out.println("文件中存在异常字符,请更新后再次尝试!");
                return;
            }
            i = 0;
            // 求出文件中的数据的个数k
            while (big[i] != null) {
                k++;
                i++;
            }
            // 求子数组最大值
            BigInteger b0 = new BigInteger("0");
            for (i = 1; i < k; i++) {
                if (big[i-1].compareTo(b0) > 0) {
                    big[i] = big[i].add(big[i-1]);
                }
            }
            for (i = 0; i < k; i++) {
                if (big[i].compareTo(bigmax) > 0) {
                    bigmax = big[i];
                }
            }
            System.out.println("所有子数组的和的最大值为" + bigmax);
            // 环形数组求子数组最小值
            for (i = 1; i < k; i++) {
                if (big2[i-1].compareTo(b0) < 0) {
                    big2[i] = big2[i].add(big2[i-1]);
                }
            }
            for (i = 0; i < k; i++) {
                if (big2[i].compareTo(bigmin) < 0) {
                    bigmin = big2[i];
                }
            }
            bigmax = bigsum.subtract(bigmin);
            //System.out.println(bigsum);
            //System.out.println(bigmin);
            if(bigmax.compareTo(bigmax2) > 0) {
                System.out.println("环形数组的所有子数组的和的最大值为" + bigmax);
            }else {
                System.out.println("环形数组的所有子数组的和的最大值为" + bigmax2);
            }
        }

    }

五、运行截图

猜你喜欢

转载自www.cnblogs.com/yang2000/p/12375229.html