软件工程 数组

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

题目要求:

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

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

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

 

设计思想:

首先定义数组中第一个数为最大值,若第一个数为负数,舍弃,若第一个数为正数,看下一个元素是否为正,若为正,则相加,用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\n", (max > mmax) ? max : mmax);
}
else
printf ("0\n");
}

return 0;
}

 

运行结果:

 

 

 

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

转载于:https://www.cnblogs.com/xinyue6/p/9904871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值