zoukankan      html  css  js  c++  java
  • 结对开发Ⅳ——一维数组求和最大的子数组(大数溢出)

    一、设计思路

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

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

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

    二、源代码

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

    三、运行截图

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

     

    四、心得体会

      虽然这次的题目要求看起来没什么难度,但是事实证明与计算机底层相接的部分才是难点啊。用软件解决硬件问题让我们头疼了很久,我们曾经有两次以为自己调出来了,但是继续把数值增大后,结果就不正确了。我们就另外写了个小程序来观察int32 类型的边界值有多大,然后我们发现最大值是232-1,再加一,就会变成-232我们就设置了相应的判断条件,使最大值溢出时提示出错。

    五、无图无真相

  • 相关阅读:
    EasyTransaction主要源码分析
    编程哲理小故事:Tina的运动会方阵
    多维扩展点的思考与设计——解决渠道、产品增加引发的腐化问题
    分布式事务框架Seata及EasyTransaction架构的比对思考
    设计,架构,框架之间是什么关系?
    你知道如何画好一幅架构图么?
    学会分享痛苦
    建立你自己的博客
    使用正确的工具软件
    掌握主动权
  • 原文地址:https://www.cnblogs.com/JJJanepp/p/4375025.html
Copyright © 2011-2022 走看看