结对开发Ⅳ——一维数组求和最大的子数组(大数溢出)

一、设计思路

由于我们第一个版本的算法不太好,导致后来拓展的两个程序无法很好地实现,我们就又重新设计了一个。我们是先写的首尾相连的那个程序,在它的基础上稍微修改了一下。

(1)数据结构是链表,存放数据和next指针;

(2)生成特别大的随机数,数据也设置得比较多。

二、源代码

未调试好

 1 // 一维最大子数组2.cpp : Defines the entry point for the console application.
 2 // 袁佩佩 于海洋
 3
 4 #include "stdafx.h"
 5 #include<iostream.h>
 6 #include "stdlib.h"
 7 #define NUM 100
 8
 9 /*链表数据结构*/
10 typedef struct LNode
11 {
12     int data;
13     struct LNode *next;
14 }LNode,*LinkList;
15 /*链表的初始化*/
16 void InitList(LinkList &L)
17 {
18     L=new LNode;
19     L->next=NULL;
20 }
21 /*链表数据的插入*/
22 void InsertList(LinkList &L)//建立循环链表
23 {
24     LNode *head,*temp;
25     head=L;
26     for(int i=0;i<NUM;i++)
27     {
28         temp=new LNode;
29         temp->data=rand()%2000000000+1000000000;
30         temp->next=NULL;
31         head->next=temp;
32         head=head->next;
33     }
34 }
35 void output(LinkList L)
36 {
37     for(int i=0;i<NUM;i++)
38     {
39         cout<<L->next->data<<" ";
40         L=L->next;
41     }
42 }
43 int main(int argc, char* argv[])
44 {
45     int max,sum,flag=0;                //sum是字数组的和,max是最大的子数组的和
46     int ordern=0,orderx=0;
47     LinkList L;
48     LNode *temp1,*temp2;
49     InitList(L);
50     InsertList(L);                    //由用户往链表中插入数据
51     temp2=L->next;
52     max=L->next->data;                //max初值是链表中第一个数
53     for(int j=0;j<NUM;j++,temp2=temp2->next)
54     {
55         for(int k=j;k<NUM;k++)
56         {
57             sum=0;
58             temp1=temp2;
59             for(int h=j;h<=k;h++,temp1=temp1->next)
60             {
61                  sum=sum+temp1->data;
62             }
63              if(max<sum)             //将最大值赋给max,并且保存当时的序号 
64              {
65                  max=sum;
66                  ordern=j;
67                  orderx=k;
68              }
69         }
70     }
71     temp1=L->next;
72     cout<<"数组:"<<endl;
73     output(L);
74     cout<<endl<<"最大子数组是:";
75     for(int i=0;i<ordern;i++)         //找出取得最大值的时候的子数组的第一个数
76     {
77         temp1=temp1->next;
78     }
79     for(j=0;j<(orderx-ordern+1);j++,temp1=temp1->next)//将取得最大和的子数组元素输出
80     {
81         cout<<temp1->data<<"  ";
82     }
83     cout<<endl<<"最大子数组的和是:"<<max<<endl;;
84
85     return 0;
86 }

三、运行截图

当代码中产生随机数的范围过大,编译器提示

四、心得体会

五、无图无真相

时间: 2024-11-10 08:29:37

结对开发Ⅳ——一维数组求和最大的子数组(大数溢出)的相关文章

结对开发-- 一维数组求和最大的子数组的大数溢出问题

结对人员:韩雪东,高扬 一.设计思路 对于大数溢出问题开始很迷茫,不大懂该干什么,思路匮乏.因为只要溢出这个数就不会被存储被改变,这样导致很难去判断溢出后该怎样做,但后来我们改变了一下思路,采用逆向思维,首先找到能存储的最大数,用它来减去将要运行的数,从而与即将要加的数比较,如果小了咋说明相加后会产生溢出,直接结束程序. 二.源代码 // ceshi.cpp : Defines the entry point for the console application. //作者:韩雪东,高扬 //

结对开发——一维数组最大子数组判断溢出

一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来的错误.所以设计者要在编码时便高度警惕,预防溢出的发生,这才是最本质的解决问题的方法.就本题而言,我们设置了元素最大个数,以及其它输入要求,尽量避免溢出的发生.1000个数相加可以实现,但非要取1000个最大的数相加,那样的计算没有意义,不会在我们的生活学习中出现,这属于科研问题,交给大神们来解决吧

《返回一个二维整数数组中最大联通子数组的和》

设计思想:(1)首先把这个二维数组按行的数目分解为与列数目具有相同数目的一维数组: (2)再分别求出这几个一维数组的最大连续子数组之和,分别记录每一个最大连续数组的首末位置: (3)接着分别比较看这几个一维数组的首末位置是否处于矩阵上相连的位置,找出位置上相连且之和为最大的数组,输出它们的和即可. 源代码: #include<iostream> using namespace std; int Max(int n,int a[],int *smark,int *mmark) { int b[1

软件工程课堂训练——结对开发之环数组最大和

一.题目及要求: 题目:返回一个整数数组中最大子数组的和 要求(新加):①如果数组A[0]...A[j-1]首尾相邻,允许A[i-1]...A[n-1],A[0]...A[j-1]之和最大:②同时返回最大子数组的位置. 结对人员:胡亚宝  焦燕 二.设计思路: 我们要解决两个问题:求出环数组中最大的子数组:并且定位出该子数组的位置,把它们的名称输出来.要解决这两个问题,我们从以下两个方面入手: ①求出最大子数组:将数组数值按顺序排好称为“一趟”,每求出一趟的最大子数组后,将第一个数值放到最后一个

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

二维数组求最大连通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 程序要使用的数组放在一个叫 input.txt 的文件中, 文件格式是: 数组的行数, 数组的列数, 每一行的元素, (用逗号分开) 每一个数字都是有符号32位整数,当然,行数和列数都是正整数. 源程序 /* 设计思路: 1.首先从文件读入一个二维整型数组(有正有负): 2.从数组中选出最小的一个数,如果为负数则除去,检验联通性: 3.联通,接下来找剩余中最小的数,

求二维整数数组中最大联通子数组的和

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 1 #include<i

返回一个二维整数数组中最大联通子数组的和(思路)

返回一个二维整数数组中最大联通子数组的和 题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: (方法一)首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的就是最大联通子数组的和. (方

返回一个二维整数数组的最大联通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求:输入一个二维整形数组,数组里有正数也有负数.求所有子数组的和的最大值. 一.设计思想 先求出这个这个数组中的最大值,并定位,然后找出这个值周围的4个数,联通这4个数中的正数,若全为负数,则查找次大值,并与最大值联通,判断联通前与联通后值得大小,若变小则不联通最大值,若变大则联通最大值,以此类推,直到最大联通子数组怎么联通都比原来的值小.