zoukankan      html  css  js  c++  java
  • 关于返回一个整数数组中最大子数组的和的问题(详细版)

            1、要求数组从文件读取。

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

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

             用Flie类+BufferedReader读取文件。

         将读入的字符串转换为大数(BigInteger类),运用已有的函数进行计算。

         

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

    用try-catch语句来检测文件中的异常字符。

  • 相关阅读:
    C#计算代码的执行耗时
    c#值类型和引用类型
    C#类、接口、虚方法和抽象方法
    15,了解如何在闭包里使用外围作用域中的变量
    函数闭包,golbal,nonlocal
    init())函数和main()函数
    函数的命名空间
    函数的默认参数是可变不可变引起的奇怪返回值
    遍历目录
    super顺序
  • 原文地址:https://www.cnblogs.com/adret/p/10567885.html
Copyright © 2011-2022 走看看