继上周的数组又提的进一步要求:
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;
}
}
}
截图:


个人反思:
感触很深,花了整整一下午加晚上去弄这些,时间特别长,中间想过要放弃去找别人的用一用就完了,后来好在我没有,很开心最后终于弄完了,虽然瑕疵还不少,但是我觉得我逐渐地正在学会用分步的思想去解决问题,我觉得这对我来说也是一大进步,以后的我首先不要轻言放弃,一定要自己去尝试才有效果。然后继续努力,你还差得很远。