课堂练习2整数数组

 

题目:返回一个整数数组中最大子数组的和02

要求

  程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是:

  数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数。 当然, 行数和列数都是正整数。

  例如下面的文件说明数组是有1行, 6列, 元素依次是: 5, 6, –3, 8, –9, 2

 

解决思路:建立一维数组,在原来课堂练习1的基础上,加入文件的输入输出。

实现代码

import java.io.*;
import java.math.BigInteger;

public class Main2 {
    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException {
        String line = "";
        String snum[] = new String[100];
        String sp[] = new String[10];// 设置num.txt中一行10个数据
        File file = new File("num.txt"); // num.txt 就在此java工程下
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(file));
        } catch (FileNotFoundException e) {
            System.out.println("文件num.txt没有在此java工程下,请设置好文件位置后再次尝试");
            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 {
            for (i = 0; i < snum.length; i++) {// 转化为BigInteger
                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) { // 数据转换时的异常处理完成要求3
            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);
        }
    }

}

num数据:1 12 45 -2 23 14 -12 21 0 -13

 

运行截图

 

 

总结:在解决这个问题的时候,需要掌握文件输入输出

学习时长:1h18min

 

posted @ 2022-03-12 23:40  kuaiquxie  阅读(39)  评论(0编辑  收藏  举报