/*
编程之美题,给定N个数的数组,只能使用乘法,不使用除法,找出N-1个数的乘积最大的一组,有两种方法,方法一:采用两个数组分别保存从左向右
和从又向左的两个乘积值,然后在扫描一次,求出最大乘积,空间换时间的方法。
方法二:通过分析这些数的性质,看有多少正数,多少负数,多少0
(1)如果有2个或2个以上的0,则返回0
(2)如果有一个0,则看去除0后的乘积为正数还是负数,如果是负数,最大值为0,返回0(即当有一个0时,看负数奇偶情况,如果负数个数是奇数,则返回0)
,如果是正数,则返回这个正数(即其它所有的乘积)
(3)如果总乘积为负数,则根据负负为正,去除绝对值最小的负数
(4)如果总乘积为正数,则如果存在正数,则除去绝对值最小的正数,否则除去绝对值最大的负数。
因为题目不让用除法,所以不能直接乘出总乘积,然后用除法,所以要一次扫描,记录正数个数,负数个数,绝对值最小正数,绝对值最小的负数,绝对值最大的负数。
*/ #include <iostream>
using namespace std; double maxmultiply(const double *A,int n)
{
if(A==NULL)
return ;
double * left=new double[n];
double * right=new double[n];
left[]=A[];
right[n-]=A[n-];
for(int i=;i<n;i++)
left[i]=left[i-]*A[i];
for(int i=n-;i>=;i--)
right[i]=right[i+]*A[i];
double result=A[];
result=max(left[n-],right[]); //先判断两个边界的时候,后面就不用比较了。
for(int i=;i<=n-;i++)
{
result=max(result,left[i-]*right[i+]);
}
return result;
} /*
方法二,记录正负数个数
*/
double maxmultiply2(const double *A ,int n)
{
if(A==NULL)
return ;
int pos=;
int neg=;
int zero=;
double fabminp=A[]; //绝对值最小的正数
double fabminn=A[]; //绝对值最小的负数
double fabmaxn=A[]; //绝对值最大的负数
double result=;
for(int i=;i<n;i++)
{
if(A[i]==)
zero++;
if(A[i]>)
{
pos++;
if(A[i]<fabminp)
fabminp=A[i];
}
if(A[i]<)
{
neg++;
if(A[i]*(-)<fabminn)
{
fabminn=A[i];
}
if(A[i]*(-)>fabmaxn)
{
fabmaxn=A[i];
}
}
}
if(zero>=)
{
if(zero>=) //有两个以上0,返回0.
return ;
else if((neg&)==) //有一个0,并且负数个数是偶数,说明乘积为正数,返回该正数,必须加括号才行
{
for(int i=;i<n;i++)
{
if(A[i]!=)
result*=A[i];
}
return result;
}
else return ; //有一个0,并且其余乘积为负数,最大为0.
}
else if((neg&)==) //负数个数是偶数(包括0),则总乘积为正,必须加括号才行
{
if(pos>) //如果有正数,则去除最小正数,例如2,3,4,-1,-2,去除2,如果3,-1,-2,则除去3
{
for(int i=;i<n;i++)
{
if(A[i]!=fabminp)
result*=A[i];
}
return result;
}
else //没有正数情况,是偶数个负数,例如-2,-3,-4,-5,去除绝对值最大的负数
{
for(int i=;i<n;i++)
{
if(A[i]!=fabmaxn)
result*=A[i];
}
return result;
}
}
else //负数个数是奇数个,总乘积为负数例如2,3,-1,-2,-3,此时去除绝对值最小的负数,-1
{
for(int i=;i<n;i++)
{
if(A[i]!=fabminn)
result*=A[i];
}
return result;
}
} int main()
{
double A[]={,,-,,,,,,-};
int n=;
cout<<maxmultiply2(A,n)<<endl;
system("pause");
}

N个数的数组求N-1个数组合乘积最大的一组的更多相关文章

  1. SPOJ Distinct Substrings(后缀数组求不同子串个数,好题)

    DISUBSTR - Distinct Substrings no tags  Given a string, we need to find the total number of its dist ...

  2. SPOJ(后缀数组求不同子串个数)

    DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct subs ...

  3. 75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。[2行核心代码]

    [本文链接] http://www.cnblogs.com/hellogiser/p/single-number-of-array-with-other-three-times.html [题目] i ...

  4. 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。

    转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...

  5. 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

    题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...

  6. CodeForces 702B Powers of Two【二分/lower_bound找多少个数/给出一个数组 求出ai + aj等于2的幂的数对个数】

    B. Powers of Two   You are given n integers a1, a2, ..., an. Find the number of pairs of indexes i,  ...

  7. 求一个数组的最大k个数(java)

    问题描写叙述:求一个数组的最大k个数.如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析: 1.解法一:最直观的做法是将数组从大到小排序,然后选出当中最大的K个数.可是这种 ...

  8. POJ 3978 Primes(求范围素数个数)

    POJ 3978 Primes(求范围素数个数) id=3978">http://poj.org/problem? id=3978 题意: 给你一个区间范围A和B,要你求出[A,B]内 ...

  9. 在数组中找几个数的和等于某个数[LeetCode]

    首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题.对于类似的这样的查找操作的具体办法就是三种解决方法: 1.暴力算法,多个for循环,很高的时间复杂度 2.先排序,然后左右夹逼,但是这样会 ...

随机推荐

  1. CRUD生成器DBuilder设计与实现

    源码位于github:https://github.com/lvyahui8/dbuilder.git .文中图片如果太小看不清楚,请右键点击“在新标签页中打开”即可看到原图 有兴趣还可以加QQ群交流 ...

  2. 使用PHP导出Word文档的原理和实例

    PHP操作Word文档的方法有很多,这里再为大家提供一种方法. 原理   一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方 ...

  3. php生成随机产生六位数密码的代码

    php生成随机产生六位数密码的代码,供大家学习参考.本文转自:http://www.jbxue.com/article/6199.html php生成随机产生六位数密码的代码,供大家学习参考. 复制代 ...

  4. post请求json内容丢失问题

    今天在项目组用json传输数据 post方法提交 发现传输过去的数据json内的+ 号被直接干掉了. 后来传输之前直接先编码. 接收端: public void ProcessRequest(Http ...

  5. 数据库应该使用异步吗 Should my database calls be Asynchronous?

    Should my database calls be Asynchronous? http://blogs.msdn.com/b/rickandy/archive/2009/11/14/should ...

  6. Css3 圆角和渐变色问题(IE9)

    border-radius: 4px; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#569B0E', endC ...

  7. ubuntu中文版切换为英文后字体变化问题解决

    为了熟悉更多Linux 的英语词汇,希望把Ubuntu 的界面换成英文的.使用System->Administration->Language Suport( 系统-> 管理-> ...

  8. 17款code review工具

    本文是码农网原创翻译,转载请看清文末的转载要求,谢谢合作! 好的代码审查器可以大大地帮助程序员提高代码质量,减少错误几率. 虽然现在市场上有许多可用的代码审查工具,但如何挑选也是一个艰巨的任务.在咨询 ...

  9. C#基础|面向对象之继承

      面向对象的世界 在现实的世界里,发现事物可以进行分类,并且各个分类中又有这关系. 在面向对象的世界里,人们用类来模拟现实世界中的各种关系. 从大的范围来说,人属于人类,如果按照不同的身份将人类进行 ...

  10. 如何获得iphone设备的剩余空间

    在手机终端开发的时候,我们需要关注手机剩余空间,因为手机不像电脑一样空间宽裕,当设备空间比较少得时候需要释放空间. 用法:先引入头文件 #include <sys/param.h> #in ...