zoukankan      html  css  js  c++  java
  • 整数数组中最大子数组的和(第二版)

    一、简介

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

    二、新增要求

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

    五、运行截图

  • 相关阅读:
    取目标描述
    DCLF RCVF SNDF SNDRCVF等用法
    CL过程监控JOB的错误消息
    取用户配置文件属性
    SNDBRKMSG 例子
    信息操作
    文件下载解决中文乱码
    table行的上移下移 上下移动
    常用表操作Sql语句
    sql删除重复行
  • 原文地址:https://www.cnblogs.com/yang2000/p/12375229.html
Copyright © 2011-2022 走看看