一位数组从文件中获取时(求出最大子数组的和并且正确处理错误的信息)

新情况:

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

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

---------------------------------------------

防止出现溢出这就要使用到BigInteger的相关的知识点 ,然后就是关于文件的读取操作(逐行进行读取之后用“,”进行分开)

下面想将一些关于BigInteger的相关知识点。

java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个int[]数组来模拟一个非常大的整数:

BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger sum = i1.add(i2); // 12345678902469135780这是相加进行的操作。
对于的BigInteger的减法操作是使用subtract这个方法进行实现。

BigIntegerIntegerLong一样,也是不可变类,并且也继承自Number类。因为Number定义了转换为基本类型的几个方法:

  • 转换为bytebyteValue()
  • 转换为shortshortValue()
  • 转换为intintValue()
  • 转换为longlongValue()
  • 转换为floatfloatValue()
  • 转换为doubledoubleValue()
  • BigInteger用于表示任意大小的整数;

    BigInteger是不变类,并且继承自Number

    BigInteger转换成基本类型时可使用longValueExact()等方法保证结果准确。

对于此次的步骤的思路和上一篇发的是一样的,不一样的就是数组是通过文件进行读取的外加了一些别的相关的操作。
具体的代码如下:
package com.ceshi;


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Scanner;

public class w{

    public static void main(String[] args) throws IOException {
        // TODO 自动生成的方法存根
        Scanner in=new Scanner(System.in);
        String fileName ="D:\\wenjian.txt";
        File file=new File(fileName);
        
        System.out.println(file.length());
        if(!file.exists()) {
            System.out.println("文件不存在!");
        }else if(file.exists() && file.length() == 2) {
            System.out.println("文件为空!");
        }
        else {
            FileReader fileReader = new FileReader(fileName);
            BufferedReader bufferedReader = new BufferedReader(fileReader);
            String line;
            int i,j;
            int flag=0;
            BigInteger ans=new BigInteger("0");
            BigInteger maxn=new BigInteger("0");
            while ((line=bufferedReader.readLine())!=null){
                String []s=line.split(",");
                for(i=0;i<s.length;i++)
                {
                    String k=s[i];
                    for(j=0;j<k.length();j++)
                    {
                        if(!((k.charAt(j)>='0'&&k.charAt(j)<='9')||k.charAt(j)=='-'||k.charAt(j)==','))
                        {
                            System.out.println("文件输入不合法,必须全部由数字组成,中间分割用逗号!");
                            flag=1;
                            break;
                        }
                    }
                    BigInteger key=new BigInteger(k);
                    BigInteger cmp=new BigInteger("0");
                    if(key.subtract(cmp).intValue()>0)//减去之后转换成int类型
                        ans=ans.add(key);//两个integer的数进行相加的步骤
                    else
                        ans=key;
                    if(ans.subtract(maxn).intValue()>0)
                        maxn=ans;
                    if(flag==1)
                        break;
                }
                if(flag==1)
                    break;
            }
            if(flag==0)
                System.out.println(maxn);
            bufferedReader.close();
            fileReader.close();
        }
    }
}

这里面主要的是用到了文件的读取操作。然后就是对于BigInteger的先关操作。

 
上一篇:数组(续)


下一篇:文件读入最大子数组