• 个人作业数组(续一)


    实验要求:(在上次要求的基础上)

    1.要求数组从文件读取。

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

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

    设计思想:

    因为要从文件中读取这就需要用到一些文件的相关知识了,我最开始做的就是先在文件中输入一个数组,以空格的形式将每个数分开,从文件中将其读出,先读入到一个字符串中,在根据空格将其分割开,并且,通过Integer.parseInt将字符串转换为int型然后在通过上次编写的求最大子数组的方法进行最大子数组的求值。下一步就是编写一个随机生成数的方法,产生规定数量的随机数。并将其写入到文件中。

    遇到的问题及解决方法:

    1.最开始在文件的读取之后对其进行分割,从String类型转化为int型时遇到了问题,首先根据空格划分的时候确实是将字符串为数组了,但是,除了第一个之外其他数组元素都含有一个空格,所以系统无法对其进行转化,之后通过查阅资料后,采用利用数字范围的方式将其解决(String[] rang = s.split("[^(-9--10-9)]");)这就使成功将文件中的元素转化为int型,并进行运算了。

    2.在文件的写入阶段也遇到了问题,在由于我直接用的FileWriter进行写入,导致存入的数都是乱码,无法通过文件进行读取。后来通过请教同学学会使用BufferWriter,将成熟的随机数写入到了文件中。另外,在编写中的另一个问题就是随机值得问题,由于随机数的值都是大于1的,为了产生负数,我对两个随机数进行相减,实现了正负数的效果

    3.第三步就是处理大数的问题了,由于最初都是用的int型的所以在输入百万级的数后就会出现溢出的状况,所以经过回来查阅相关资料都将int型改为了大数Biginteger型。

     1 package test;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.File;
     6 import java.io.FileInputStream;
     7 import java.io.FileWriter;
     8 import java.io.IOException;
     9 import java.io.InputStreamReader;
    10 import java.math.BigInteger;
    11 import java.util.Scanner;
    12 
    13 public class shu1 {
    14     static String s = "";
    15     static Scanner in = new Scanner(System.in);
    16 
    17     public static void main(String[] args) throws IOException {
    18         
    19         
    20         chansheng();
    21         read();
    22         
    23         //System.out.println(s);
    24         String[] rang = s.split("[^(-9--10-9)]");  //按照数字的方式对读入的字符串进行划分,并存入到rang数组中
    25         
    26         
    27         
    28 //        int value = 0;
    29 //        int sum =0;
    30         BigInteger value = new BigInteger("0");
    31         BigInteger sum = new BigInteger(String.valueOf(rang[0]));    //将数组中的第一个值赋值给sum
    32         
    33         //sum = Integer.parseInt(rang[0]);
    34         for(int i = 0;i < rang.length;i++)
    35         {
    36             int a = value.compareTo(BigInteger.valueOf(0));
    37             if ( a == 0 || a == -1) {
    38                 //value = Integer.parseInt(rang[i]);          //当用于记录的值小于等于0时就无需对其进行相加了,此时就等于下一个值
    39                 value = new BigInteger(String.valueOf(rang[i]));   
    40             }else {
    41                 value.add(new BigInteger(String.valueOf(rang[i])));
    42                 //value += Integer.parseInt(rang[i]);  //当value的值仍大于0时就继续相加
    43             }
    44             
    45             if (sum.compareTo(value) == -1) {    //用sum等于子数组的最大值,若value的值大于sum的值,则将value赋值给sum
    46                 sum = value;
    47             }
    48         }
    49         
    50         System.out.println("最大值为:" + sum);
    51 
    52         
    53             
    54            
    55     }
    56      //读取文件的方法    
    57      public static String read() throws IOException
    58        {
    59               
    60             FileInputStream fis = new FileInputStream("d:\\文件\\数组.txt");
    61             BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    62             String temp = "";
    63             while((temp = br.readLine()) != null) 
    64               s = s + temp + "\n";   //将文件中的文章都存入字符串s中
    65             
    66             fis.close();//关闭文件
    67             br.close();
    68                return s;
    69          }
    70      
    71      //产生随机数,并将其写入到文件的操作
    72     public static void chansheng() throws IOException
    73     {
    74         int n;
    75         System.out.println("请输入计算的数据量");
    76         n = in.nextInt();
    77         File file1 = new File("d:\\文件\\数组.txt");
    78         FileWriter out = new FileWriter(file1);
    79         BufferedWriter bw = new BufferedWriter(out);
    80         for(int i = 0;i < n ; i++)
    81         {
    82             //int ran = (int)(Math.random()*10000000) - (int)(Math.random()*100000000);
    83             int ran = (int)(Math.random()*10000000) - (int)(Math.random()*100000000);
    84             BigInteger a = new BigInteger(String.valueOf(ran));
    85             //bw.write(String.valueOf(ran) + " ");
    86             bw.write(String.valueOf(a) + " ");
    87         }
    88         bw.close();
    89         
    90     }
    91      
    92 }

    实验结果截图:

    五百万条数据大约46.6M

    总结:

    经过本次实验,我深刻的意识到在程序在进行运算的过程中,保证数据的准确性是一个重点,由于数据精度以及范围的不同在进行数据计算的时候就会产生数据过大导致数据溢出,或者处理的数据量过大而导致程序直接卡死。根据这几次的上课,以及实验认识到了自己思维的局限,自己所处理的都是实验室类型的程序,缺乏对时间、空间以及实际问题的具体分析,其实程序中还存在着很大的问题。之后一定要尽可能的去多想一下实际问题,尽可能的完善自己的程序。

  • 相关阅读:
    Gym 102040B Counting Inversion(超级数位dp)
    Educational Codeforces Round 104 (Rated for Div. 2)(A~D)
    2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1)_组队训练
    线段树板子
    Codeforces Round #700 (Div. 2)
    Codeforces Round #699 (Div. 2)
    Codeforces Round #698 (Div. 2)
    字典树——实现字符串前缀查找(可返回字符串)
    LeetCode146-LRU缓存机制
    用到过的git命令
  • 原文地址:https://www.cnblogs.com/1gaoyu/p/10533791.html
Copyright © 2020-2023  润新知