zoukankan      html  css  js  c++  java
  • 软件工程 数组

    团队项目:首尾相接的整数数组最大子数组的和

    题目要求:

    输入一个整形数组,数组里有正也有负。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    如果数组首尾相接,那么最大子数组的和。

     

    设计思想:

    首先定义数组中第一个数为最大值,若第一个数为负数,舍弃,若第一个数为正数,看下一个元素是否为正,若为正,则相加,用tmp记录最大值。然后再定义数组中最后一个元素为最大值,判断方法与上相同,直至找到最大子数组和。

     

    出现问题:一开始思路理不清楚,不知道怎样将数组连接成环。

     

    解决方案:通过参考网上资料,我俩总算可以理清思路,编写出程序运行出正确结果。

     

    程序主代码:

    #include <stdio.h>

    int Max_Sub (int arr[], int n){
    int i;
    int tmp;
    int max;

    tmp = max = arr[0];
    for (i=1; i<n; ++i){
    if (tmp > 0)
    tmp += arr[i];
    else
    tmp = arr[i];
    if (tmp > max)
    max = tmp;
    }
    return max;
    }

    int Max_Left (int arr[], int n, int * left){
    int i;
    int tmp;
    int max;

    tmp = max = arr[0];
    *left = 0;
    for (i=1; i<n; ++i){
    tmp += arr[i];
    if (tmp > max){
    max = tmp;
    *left = i;
    }
    }
    return max;
    }

    int Max_Right (int arr[], int n, int * right){
    int i;
    int tmp;
    int max;

    tmp = max = arr[n-1];
    *right = 0;
    for (i=n-2; i>=0; --i){
    tmp += arr[i];
    if (tmp > max){
    max = tmp;
    *right = i;
    }
    }
    return max;
    }

    int Min_Sub (int arr[], int n){
    int i;
    int tmp;
    int min;

    tmp = min = arr[0];
    for (i=1; i<n; ++i){
    if (tmp < 0)
    tmp += arr[i];
    else
    tmp = arr[i];
    if (tmp < min)
    min = tmp;
    }
    return min;
    }

    int main(void){
    int n;
    int arr[100000];
    int max;
    int min;
    int left_max;
    int right_max;
    int left;
    int right;
    int mmax;
    int i;
    int flag;

    while (scanf ("%d", &n) != EOF){
    flag = 0;
    for (i=0; i<n; ++i){
    scanf ("%d", &arr[i]);
    if (arr[i] > 0)
    flag = 1;
    }
    if (flag == 1){
    max = Max_Sub (arr, n);
    left_max = Max_Left (arr, n, &left);
    right_max = Max_Right (arr, n, &right);
    if (left > right){
    mmax = 0;
    for (i=0; i<n; ++i)
    mmax += arr[i];
    min = Min_Sub (arr, n);
    mmax -= min;
    }
    else
    mmax = left_max + right_max;
    printf ("%d ", (max > mmax) ? max : mmax);
    }
    else
    printf ("0 ");
    }

    return 0;
    }

     

    运行结果:

     

     

     

       队员 :张佳玮 https://www.cnblogs.com/zzzzxiaolan/

  • 相关阅读:
    Python学习(四)数据结构 —— list tuple range
    Python学习(四)数据结构 —— bool
    Python学习(四)数据结构 —— int float
    Python学习(四)数据结构(概要)
    Python学习(三)流程控制
    Python学习(二)Python 简介
    Python学习(一)安装、环境配置及IDE推荐
    iOS崩溃日志 如何看
    python 读取excel表格内不同类型的数据
    python xlrd读取excel常用方法
  • 原文地址:https://www.cnblogs.com/xinyue6/p/9904871.html
Copyright © 2011-2022 走看看