一、简介
根据上篇博客的内容,题目新加了要求,暂且称为上篇博客的加强版吧
二、新增要求
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); } } }
五、运行截图