zoukankan      html  css  js  c++  java
  • 从文件读入数组并求最大子数组和

    题目:1.要求数组从文件读取。
            2.如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出。
            3.另外, 如果输入文件的参数有错误, 这个程序应该能正常退出, 并显示相应的错误信息。 任何输入错误都不能导致你的程序崩溃。

    设计思路:先判断要读取数据的文件是否存在,如果不存在,输出文件不存在或打开错误语句,并且结束程序。文件存在,从文件中读取数组,先将数组放在一个字符串容器中,然后对每一个字符串进行判断,定义一个isInt方法判断字符串是否为整形,不是的话输出文件中含有不是整形的数,并且结束程序,是的话则存进数组。定义的子数组和数组长度为int lon = ((1+array.length)*array.length)/2;然后利用for循环嵌套然后求出所有子数组和,最后比较子数组和中的最大值。

    源程序代码:

    package 从文件读数组;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    public class Main {
     public static boolean isInt(String val) {
      try {
      Integer.parseInt(val);
      return true;
      } catch (NumberFormatException e) {
      return false;
      }
      }
      public static void judeFileExists(File file) {
       if (file.exists()) {
        System.out.println("file exists");
              }
       else {
                    System.out.println("file not exists, please create it ...");
                    System.exit(0);
                }
       
            }
      public static int[] toArrayByFileReader1(String name) {
       File file = new File(name);
       judeFileExists(file);
      ArrayList<String> arrayList = new ArrayList<>();
      try {
       FileReader fr = new FileReader(name);
       BufferedReader bf = new BufferedReader(fr);
       String str;   // 按行读取字符串
       while ((str = bf.readLine()) != null) {
        arrayList.add(str);
        }
       bf.close();
       fr.close();
       } catch (IOException e) {
        e.printStackTrace();
        }  // 对ArrayList中存储的字符串进行处理
      int length = arrayList.size();
      int[] array = new int[length];
      for (int i = 0; i < length; i++) {
       String s = arrayList.get(i);
       if(!isInt(s)) {
        System.out.println("数组中存在不是整形的数");
        System.exit(0);//终止程序
       }
       array[i] = Integer.parseInt(s);
       }
      // 返回数组
      return array;
      }
      /*求所有子数组的和   放进sum数组中*/
      public static void main(String args[]) {
      int[] array =  toArrayByFileReader1("shuju.txt");
      System.out.println("从文件中读取的数组");
      for(int i = 0;i < array.length ;i++) {//输出从文件中读取的数组
       System.out.print(array[i]+"  ");
      }
      int lon = ((1+array.length)*array.length)/2;
      if(lon>30000000) {
       System.out.println("数组太大!");
       System.exit(0);
      }
      int[] sum = new int[lon];
      int changdu = 0;
         for(int i = 0;i < array.length ;i++) {//生成子数组和
          int asum = 0;
          for(int j = 0; j < array.length - i;j++) {
           asum = asum + array[i+j];
           sum[changdu] = asum;
           changdu++;
          }
         }
         //输出所有子数组的和的数值
         System.out.println(" ");
         System.out.println("输出所有子数组的和的数值");
          int max = sum[0];
         for(int k = 0; k < lon;k ++) {
          System.out.print(sum[k]+" ");
         }
        
         for(int m = 1; m < lon;m++) {
          if(sum[m]>max)             //求sum数组最大的值
           max = sum[m];
        
     }
         System.out.println(" ");
         System.out.println("最大子数组和为:" + max);//输出最大的子数组和   
     }
       
    }

    结果截图:

     

    个人反思:JAVA语言对文件的操作有所忘记,需要经常复习。对于这个问题,最开始找不到思路应该一步步的来解决问题,先从打开文件读取数据开始。对于有时间复杂度限制的问题,应该尽量的多用方法,用if语句,而不是用很多for循环。

  • 相关阅读:
    css之position
    js之循环语句
    js之条件判断
    js之字典操作
    js之获取html标签的值
    5.15 牛客挑战赛40 C 小V和字符串 数位dp 计数问题
    5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp
    luogu P4525 自适应辛普森法1
    luogu P1784 数独 dfs 舞蹈链 DXL
    5.21 省选模拟赛 luogu P4207 [NOI2005]月下柠檬树 解析几何 自适应辛普森积分法
  • 原文地址:https://www.cnblogs.com/zjl-0217/p/10549489.html
Copyright © 2011-2022 走看看