题目要求:
1.要求数组从文件读取。
2.如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出
设计思路:经过上次的从控制台读取数组,这次改为从文本文件读取,并且要求个数多,且单体数值大,那么设计思路就是首先创建一个文件,然后通过random去创建随机数,并存入文件,然后通过file函数读取文件中的数组并赋值给array数组,后面经过循环读取出子数组的和的最大值
package 数组续集; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class shuzu { public static void main(String[] args)throws IOException { List<Integer> list=new ArrayList<>(); Scanner scan=new Scanner(System.in); System.out.println("请执行操作:1、普通数组求最大子数组 2、百万数组求最大子数组"); int x=scan.nextInt(); if(x==1) { try { File file = new File("C:\\Users\\LJM\\Desktop\\shuzu.txt"); if(file.isFile() && file.exists()) { InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8"); BufferedReader br = new BufferedReader(isr); String lineTxt = ""; while ((lineTxt = br.readLine()) != null){ list.add(Integer.parseInt(lineTxt)); } Object[]a=list.toArray(); System.out.println((int)a[1]+(int)a[3]); br.close(); int sum=a.length; int sum1=0; for(int i=1;i<=sum;i++) { sum1=sum1+i; } int [] b=new int[sum1]; int temp1=0; for(int i=0;i<sum;i++) { int temp=0; for(int k=0;k<sum-i;k++) { temp=temp+(int)a[i+k]; b[temp1]=temp; temp1++; } } for(int i=0;i<sum1-1;i++) for(int k=0;k<sum1-1-i;k++) { if(b[k]<b[k+1]) { int temp2=b[k]; b[k]=b[k+1]; b[k+1]=temp2; } } System.out.println("最大的子数组和为"+b[0]); } else { System.out.println("文件不存在!"); } } catch (Exception e) { System.out.println("文件读取错误!"); } } if(x==2) { FileWriter fw = null; try { //创建字符输出流 fw = new FileWriter("C:\\Users\\LJM\\Desktop\\shuzu1.txt"); for(int i=0;i<1000;i++) { int intval=(int)((Math.random()*100000000)-50000000); fw.write(""+intval+"\r\n"); } } catch (IOException ioe) { ioe.printStackTrace(); } finally { //使用finally块来关闭文件输出流 if (fw != null) { fw.close(); } } try { File file = new File("C:\\Users\\LJM\\Desktop\\shuzu1.txt"); if(file.isFile() && file.exists()) { InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "utf-8"); BufferedReader br = new BufferedReader(isr); String lineTxt = ""; while ((lineTxt = br.readLine()) != null){ list.add(Integer.parseInt(lineTxt)); } Object[]a=list.toArray(); System.out.println((int)a[1]+(int)a[3]); br.close(); int sum=a.length; int sum1=0; for(int i=1;i<=sum;i++) { sum1=sum1+i; } int [] b=new int[sum1]; int temp1=0; for(int i=0;i<sum;i++) { int temp=0; for(int k=0;k<sum-i;k++) { temp=temp+(int)a[i+k]; b[temp1]=temp; temp1++; } } for(int i=0;i<sum1-1;i++) for(int k=0;k<sum1-1-i;k++) { if(b[k]<b[k+1]) { int temp2=b[k]; b[k]=b[k+1]; b[k+1]=temp2; } } System.out.println("最大的子数组和为"+b[0]); } else { System.out.println("文件不存在!"); } } catch (Exception e) { System.out.println("文件读取错误!"); } } } }
结果截图:
个人反思:对于这个程序,首先我能懂算法,以及思路,但是就是语法不会用,就是在网上查语法然后连接不到一起,就不能用,可以如果我看别人的程序,可以看懂,每次一点点积累语法,这次学会了file这个读取,虽然说我自己写还是写不出来,但是我找到这个语法至少会用了,还有我知道了定义一个未知的数组用array,还有一点数组的知识,但是只是浅显的一点,虽然学的不多,但是累计起来一定可以的。