zoukankan      html  css  js  c++  java
  • 软件工程结对开发——一维最大子数组求和溢出问题

    一、题目要求

      题目:返回一个整数数组中最大子数组的和。
      要求:
        要求程序必须能处理1000 个元素;
        每个元素是int32 类型的;
        输入一个整形数组,数组里有正数也有负数。
        数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
        求所有子数组的和的最大值。要求时间复杂度为O(n)。

    二、设计思路

      将数组第一个和第二个数置为2的63次方,观察结果是否溢出。

    三、源代码

     1 package com.java.lianxi;
     2 
     3 import java.util.Scanner;
     4 
     5 public class lianxi4 {
     6     public static void main(String[] args)
     7     {
     8         int num,i;
     9         long sum=0;
    10         long max;
    11         Scanner cin=new Scanner(System.in);
    12         System.out.print("请输入数组的长度:");
    13         num=cin.nextInt();
    14         long array[]=new long[num];
    15         array[0]=(long)Math.pow(2,63);
    16         array[1]=(long)Math.pow(2,63);
    17         max=array[0];
    18         for(i=2;i<num;i++)
    19         {
    20             if((int)(Math.random()*2)==0)
    21             {
    22                 array[i]=(long)(Math.random()*100000000);
    23             }
    24             else
    25             {
    26                 array[i]=-(long)(Math.random()*100000000);
    27             }
    28         }
    29         for(i=0;i<num;i++)
    30         {
    31              if(sum<=0)
    32              {
    33                  sum=array[i];  
    34              }
    35              else
    36              {
    37                  sum=sum+array[i];
    38              }
    39              if(sum>max)
    40              {
    41                  max=sum;
    42              }
    43         }
    44         if(max==(long)Math.pow(2,63))
    45         {
    46             System.out.println("大数溢出");
    47             System.out.print("子数组和的最大值为:"+max);
    48         }
    49         else
    50         {
    51             System.out.print("子数组和的最大值为:"+max);
    52         }
    53     }
    54 
    55 }

    四、运行结果截图

    五、心得体会

      通过测试,发现当溢出时,最大子数组的和恒为2的63次,也就是long型所能表示的最大整数,出现大数溢出,所得的不是我们想要的结果。

    我们想了很久也没有想出来有什么解决办法,因为数据类型所能表示的数就那么大,但是如果想得到正确的结果,我们可以不输出一个最终结果,可以输出几个数相加,

    但是考虑到相加的几个数都要控制在2的63次方之内。

        还想了一个就是可以把最后结果当成两个变量来显示,高位放在其中一个变量,低位放在另一个变量,但是我们都没有实现。

  • 相关阅读:
    一个改写MBR的例子
    explore没有桌面
    Guidance of Set up FTP Server
    重启远程机器(不登录远程机器下的重启)
    Eclipse 一些小知识
    check time period
    Scrum 冲刺——Day 1
    Scrum 冲刺——Day 2
    初学C语言
    CSS选择器
  • 原文地址:https://www.cnblogs.com/maximumminimum/p/4378570.html
Copyright © 2011-2022 走看看