2.13子数组的最大乘积

问题:给定一个长度为N 的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合乘积中最大的一组,并写出算法的时间复杂度。

----------------------------------------

看到这个题目,我的第一感觉是只要找到该数组中最小的数,然后排除这个数不就可以吗?

但是问题是如果数据都是正数还好,上面的办法可以实现,但是如果有负数,问题就比较难办。我们采用最基本的方法,就是把任意的N-1个数抽取,然后有N次这样的组合,算法的时间复杂度为:O(N^2)

我们可以很快的写出代码:

#include <iostream>

using namespace std;

void func1(int a[], const int n)
{
	
	float b[10]={1,1,1,1,1,1,1,1,1,1};
	for (int i = 0;i<n;i++)
	{
		for(int j = 0;j<n;j++)
		{
			if(i == j)
			{

			}
			else
			{
			b[i] = b[i]*a[j];

			}

		}
		cout<<b[i]<<endl;
		b[i]=1;

	}

}

void main()
{
	int a[10] = {1,3,4,0,2,1,2,9,3,4};
	func1(a,10);
	
}

 第二种方法:

using namespace std;

void func2(int a[], const int n)
{
	int s[11];//定义前n个数的积
	int t[11];//定义后n个数的积
	int p[11];//积

	s[0] = 1;
	t[n] = 1;

    //输出数组前1-n的乘积
	for(int m =1;m<n+1;m++)
	{
		s[m] = s[m-1]*a[m-1];
		cout<<s[m]<<' ';
	}
	cout<<endl;

	//输出后n-1的乘机
	for(int k=n-1;k>-1;k--)
	{
		t[k] = t[k+1]*a[k];
		cout<<t[k]<<' ';
	}
	cout<<endl;
	for(int v= 1;v<n+1;v++)
	{
		p[v] = s[v]*t[v+1];
		cout<<p[v]<<endl;

	}


}

 

posted @ 2012-08-03 00:21  CBDoctor  阅读(303)  评论(0编辑  收藏  举报