继上周的数组又提的进一步要求:
1.要求数组从文件读取。
2.如果输入的数组很大, 并且有很多大的数字, 就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。
3.另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。
设计思路:
我觉着解决这个问题一定要分步实现,首先别管后面要先实现数组从文件中读取,刚开始对我来说这步就挺难的,因为完全忘了文件读取的方式,然后我就去网上查了一下如何从文件中读取数据,一开始我是自己往文件里写数据,后来就开始通过控制台输入写入文件然后在读取
第二步就是实现写入文件用随机数的形式,而不是手动输入,
第三步考虑各种异常使程序不崩,比如文件是否存在,输入产生的随机数个数时是否为纯数字,文件是否读取成功
第四步就是随机产生正负数的问题,我想过很多方法,但是后来我从网上找了一个比较简便的,利用这个int aa=(int)(Math.pow(-1, a));/*表示-1的a次方*/ 产生负1或者正1然后乘以随机数,这样就可以随机出现正负数
第五步考虑大数的问题,
最后就是套用上次的子数组求和了
https://vimsky.com/article/3417.html
http://www.cnblogs.com/unknownname/p/8823887.html
https://blog.csdn.net/qfikh/article/details/52832196
我觉得这几篇文章还有别人的博客园给了我一些启发,最后利用BigInteger num2=new BigInteger(String.valueOf(num));
bw.write(String.valueOf(num2));//来保证运算精度不溢出
源代码:
package array; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.math.BigInteger; import java.util.Scanner; public class array { public static void main(String[] args) { writeFile(); int datas[]=readFile(); for( int i=0;i<datas.length;i++) { System.out.print(datas[i]+" "); } int array[]=new int[datas.length]; int array2[]=new int[datas.length]; int n=datas.length; for(int i=0;i<n;i++) { array2[i]=0; array[i]=datas[i]; } int max; for(int i=0;i<n;i++) { int sum=0; max=array[i]; for(int j=i;j<n;j++) { sum=sum+array[j]; if(max<sum) { max=sum; } } array2[i]=max; //System.out.println(max); } int k=array2[0]; for(int i=0;i<n;i++) { if(array2[i]>k) { k=array2[i]; } } System.out.println("最大值"+k); } /* 写入txt文件*/ public static void writeFile() { File f=new File("E:\txt\array.txt"); if(!f.exists()) { try { f.createNewFile(); System.out.println("array.txt创建完成"); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); System.out.println("array.txt创建失败"); } } FileWriter fw; try { fw = new FileWriter(f); BufferedWriter bw=new BufferedWriter(fw); System.out.println("请输入随机数的个数"); Scanner sc=new Scanner(System.in); int n=0; if(sc.hasNextInt()) { n=sc.nextInt(); System.out.println(n); } else { System.out.println("请输入正确的数字~!"); System.exit(0); }/* hasNextInt()方法是判断控制台接收是否为数字, 当你在控制台输入一个字符的时候,hasNextInt()判断你输入这个字符是不是数字, 而不是接收值,当if判断通过之后执行接收,也就是你输入的那个字符,*/ for(int i=0;i<n;i++) { int a=(int)(Math.random()*2+1); int aa=(int)(Math.pow(-1, a));/*表示-1的a次方*/ int aaa=(int)(Math.random()*1000000000); int num=aa*aaa; BigInteger num2=new BigInteger(String.valueOf(num)); bw.write(String.valueOf(num2));//保证运算精度不溢出 bw.write(" "); } bw.newLine(); bw.close(); fw.close(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } public static int[] readFile() { FileReader fr; try { fr = new FileReader("E:\txt\array.txt"); BufferedReader br=new BufferedReader(fr); String line; String s=""; while ((line = br.readLine()) != null) { // 一次读入一行数据 s=s+line; } String []data=s.split(" ");//按照空格分割字符串 int [] datas=new int[data.length]; for(int j=0;j<data.length;j++) { datas[j]=Integer.parseInt(data[j]); } return datas; } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); System.out.println("读取文件失败"); return null; } } }
截图:
个人反思:
感触很深,花了整整一下午加晚上去弄这些,时间特别长,中间想过要放弃去找别人的用一用就完了,后来好在我没有,很开心最后终于弄完了,虽然瑕疵还不少,但是我觉得我逐渐地正在学会用分步的思想去解决问题,我觉得这对我来说也是一大进步,以后的我首先不要轻言放弃,一定要自己去尝试才有效果。然后继续努力,你还差得很远。