课堂练习(返回一个整数数组中最大子数组的和)

1.设计思想

  只用一个主函数即可完成。

  首先,定义一个整型数组,让用户输入一组整数。

  然后,判断这一组数的正负还有零的情况。

  最后,根据判断出来的情况进行选择执行 if 语句,情况分别为全为0,负数和0,正数和0还有正数负数和0。

2.源代码

  1 /*
  2  * For the maximum of the subarray of an integer array
  3  * The start time 2016/4/8 16:50
  4  * The end of time 2016/4/8 18:30
  5  * Author Jing
  6 */
  7 package arraymax;
  8 import java.util.*;
  9 public class SumArray {
 10
 11     public static void main(String[] args) {
 12
 13         Scanner sca=new Scanner(System.in);
 14         System.out.println("输入整数数组数的个数");
 15         int num=sca.nextInt();
 16
 17         int a[]=new int[num],b[]=new int[num];
 18         int i;
 19         System.out.println("输入此组整数数组");
 20         for(i=0;i<num;i++)
 21         {
 22             a[i]=sca.nextInt();
 23         }
 24         int l=0,j=0,k=0,sum=0,max;
 25         for(i=0;i<num;i++)//判断输入数组的正负情况
 26         {
 27             if(a[i]>=0)
 28             {
 29                 j++;
 30             }
 31             if(a[i]<0)
 32             {
 33                 k++;
 34             }
 35             if(a[i]==0)
 36             {
 37                 l++;
 38             }
 39         }
 40         if(k==num)//全为负数
 41         {
 42             max=a[0];
 43             for(i=1;i<num;i++)
 44             {
 45                 if(max<a[i])
 46                 {
 47                     max=a[i];
 48                 }
 49             }
 50             System.out.println("最大子数组和为 "+max);
 51         }
 52         else if((l+k)==num)//只有负数和0
 53         {
 54             System.out.println("最大子数组和为  0");
 55         }
 56         else if(j==num)//全为非负数
 57         {
 58             for(i=0;i<num;i++)
 59             {
 60                 sum+=a[i];
 61             }
 62             System.out.println("最大子数组和为 "+sum);
 63         }
 64         else
 65         {
 66             for(i=0;i<num-1;i++)
 67             {
 68                 if(a[i]>=0&&a[i+1]>=0)
 69                 {
 70                     a[i+1]=a[i]+a[i+1];
 71                     a[i]=0;
 72                 }
 73                 if(a[i]<0&&a[i+1]<0)
 74                 {
 75                     a[i+1]=a[i]+a[i+1];
 76                     a[i]=0;
 77                 }
 78             }
 79             k=0;
 80             j=0;
 81             while(k<num)//循环完成后b[]中只有正负数
 82             {
 83                 if(a[k]!=0)
 84                 {
 85                     b[j]=a[k];
 86                     j++;
 87                 }
 88                 k++;
 89             }
 90             if(b[0]<0) //寻找第一个正数的下标
 91             {
 92                 i=1;
 93             }
 94             else
 95             {
 96                 i=0;
 97             }
 98             while(i<j-2)//只有正数和负数时进行计算
 99             {
100                 if(b[i]>(-b[i+1]) && (-b[i+1])<b[i+2])
101                 {
102                     b[i+2]=b[i]+b[i+1]+b[i+2];
103                     b[i]=0;
104                     b[i+1]=0;
105                     i=i+2;
106                 }
107                 else
108                 {
109                     i=i+2;
110                 }
111             }
112             max=b[0];
113             for(i=1;i<j;i++)
114             {
115                 if(max<b[i])
116                 {
117                     max=b[i];
118                 }
119             }
120             System.out.println("最大子数组和为 "+max);
121         }
122     }
123 }

The Main Code

3.结果截图

4.编程总结

  由于时间问题,此程序编的有些仓促,还有很多不足之处,以及需要优化的地方。在空余时间里,我再继续思考,争取编出一个最起码自己满意的程序。

时间: 2024-10-10 02:02:37

课堂练习(返回一个整数数组中最大子数组的和)的相关文章

课堂练习求环整数组中最大子数组之和

设计思路:之前还有一个课堂练习,是用户输入一个整数组,求其中最大子数组之和,我借鉴的其他同学的代码,仅在此基础上修改的.运用try,catch使得用户不必在输入数组之前输入数组的长度,但是需要一个除整数以外的数来结尾.一共使用了3个循环,运用一个循环得出每个数组中最大子数组之和的最大值,一个是用来计算最大子数组之和,最后一个用来实现数组的前移.第一个循环中包着另外两个循环.总的来说,是在之前课堂练习的基础上增加了将一个数组中的每个数做一次最前面的数,从中求出最大值. 程序代码: 1 import

返回一个整数组的最大子数组和

#include<iostream>using namespace std;int max(int a,int b){ if(a>b) {return a;}else{ return b;}}int maxsum(int a[],int n){ int i;int maxsofar=0;int maxendinghere=0;for (i=0;i<n;i++){maxendinghere=max(maxendinghere+a[i],0);maxsofar=max(maxsofar

软件工程课堂练习:返回一个一维整数数组中最大子数组的和

题目:返回一个一维整数数组中最大子数组的和.要求:输入一个一维整形数组,数组里有正数也有负数.一维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 此次何琳琳负责程序分析,代码编程,张一博负责代码复审和代码测试计划. 经分析讨论设计思路如下: 1.定义一个长为20的数组,先对前10个数进行初始化,后10个数等于前10个数: 2.设置长度为10的循环依次以前十个数为头进行最大子数组的计算: 3,再设置一个数组用来存储

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

课堂练习(返回一个环状一维整数数组中最大子数组的和)

设计思路: (1)将循环数组拆为我们熟悉的以为数组 (2)通过每个数组元素在数组中位置前移一位来实现环的拆分(array[i1]=array[i1+1]) (3)在每次拆分后的数组中求出最大子数组和并记录到一个新的数组result[]中 (4)求出result[]中的最大值r作为循环数组的最大值 拆分后数组最大子数组喝的解决: (1)定义整数数组arr[i] (2)定义maxsum为最大子数组和并赋初值为arr[0] (3)定义一个中间变量temp由arr[0]计算子数组(连续的)的和当temp

软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 一.设计思想 1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数. 2.从数组中第一个元素a[0]开始,依次计算a[0].a[0]+a[1].a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值. 3.再从数组第二个元素a[1]开始,依

课堂练习----一个整数数组中最大子数组的和(2)

本次的题目是:返回一个整数数组中最大子数组的和 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 分析: 这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的

课堂练习----一个整数数组中最大子数组的和(1)

本次的题目是:返回一个整数数组中最大子数组的和 要求:1.输入一个整形数组,数组里有正数也有负数.2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.3.求所有子数组的和的最大值.要求时间复杂度为O(n) 分析: 当我们求出的累加和加上一个正数的时候,整个累加和就会增加,当我们的累加和加上一个负数的时候,整个累加和就会减小,我们用一个变量max保存累加和的最大值,另外,我们的累加和如果为负数的时候,如果继续加数不把累加和清零的话,那么整个和就会减小,因此如果累加和为负,就把累加和

返回一个整数数组中最大子数组的和(2)

题目:返回一个整数数组中最大子数组的和 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 在做前面一道题目时,并没有考虑数组个数的上限及随机数位数问题,以为是要程序不出错,就是完美的.而通过课堂上验证上次程序,发现数组的和超过某一值时,将不会显示,但同样,程序不会报错,在小程序中后果并不严重,但是一旦开发大型

返回一个整数数组中最大子数组的值(程序能处理1000个元素)

课堂练习: 题目:要求返回一个整数数组中最大子数组的值 要求:程序必须能处理1000个元素 每个元素是int32类型的 设计思路: 将数组的大小定义为1000,每个元素定义为int32类型,取数值时对数成2的32次方,这样数值可以越界. 程序: #include <iostream>  #include<stdlib.h>  #include<time.h>  using namespace std;    int main()  {     int i;     in