在《编程之美》看到这样的题:求连续子序列和最大
int LongMaxArrayCount(int data[],int n){
int tempOne=0;
int Targe=0;
for (int i = 0; i < 20; i++)
{
tempOne+=data[i];
if (tempOne>tempOne+data[i+1])
{
if (tempOne>Targe)
{
Targe=tempOne;
}
tempOne=0;
i++;
}
}
return Targe;
}
变形1:N个整数,求其中任意N-1个数的乘积中的最大的一个,不能用除法。
N个数的乘积为P
(1)P的值为正,则除去一个最小的正数
(2)P的值为负,则去除一个最大的负数
(3)P的值为0,
a.有且只有一个0,若其他积为正,除去一个0,,否则除去一个最大的负数
b.2个以上0,除去一个0;
变形2:连续子序列积最大
【算法分析】
经过上面的分析,我们得到以下算法:
1、从左边开始,依次扫描数组,同时用tmp存储到当前的数的乘积。若tmp为0,则tmp置1,继续扫描;若tmp大于最大值result,则存储,继续扫描;
2、从右边开始,反方向重复过程1。
#include <iostream>
#include <cstdlib>
using namespace std;
//找到长度为n的arr数组中最大的连续积
long long FindMax(int arr[], int n){
if(n <= 0)return 0;
long long result = arr[0]; //存储当前最大值
long long tmp = 1; //存储当前序列积
//从左往右扫描
for(int i = 0; i < n; i++){
tmp *= arr[i];
if(tmp == 0){tmp = 1;continue;}
if(tmp > result)result = tmp;
}
//从右往左扫描
tmp = 1;
for(int i = n-1; i >= 0; i--){
tmp *= arr[i];
if(tmp == 0){tmp = 1;continue;}
if(tmp > result)result = tmp;
}
return result;
}
int main(){
int n;
cin >> n;
int *arr = new int[n];
for(int i = 0; i < n; i++) cin >> arr[i];
cout << FindMax(arr, n) << endl;
system("pause");
return 0;
}
转自:
http://bbs.youkuaiyun.com/topics/90460367
http://764293072.diandian.com/post/2011-09-23/5250369