/*
编程之美题,给定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. css3 回到顶部书写

    回到顶部 JS 代码  backTop = function(){  if(!document.querySelector("#backTop")){return;}        ...

  2. [HTML] <input> 标签

      可选的属性 属性 值 描述 accept mime_type 规定通过文件上传来提交的文件的类型. align left right top middle bottom 不赞成使用.规定图像输入的 ...

  3. OpenSessionInViewFilter与org.springframework.dao.InvalidDataAccessApiUsageException

    报错:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r ...

  4. python正则的中文处理

    因工作需要,要查找中文汉字分词,因为python正则表达式\W+表示的是所有的中文字就连标点符号都包括.所以要想办法过滤掉. 参考博客:http://log.medcl.net/item/2011/0 ...

  5. linux安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH),提示解决方法

    [root@localhost mysql-5.5.11]# cmake . 出现以下错误提示: -- Could NOT find Curses (missing:  CURSES_LIBRARY ...

  6. windows下STM32开发环境的搭建

    一.概述 1.说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改 ...

  7. c语言通过89C51驱动1602液晶显示(入门级别)

    工具proteus,keil 步骤: 1.画好电路图 2.在指令模式下,设置好显示模式以及光标位置 3.在写数据模式下,向1602写入显示字符(1602只能显示数字和字符) 电路图 #include ...

  8. hdu 2665 Kth number(划分树模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ]  改变一下输入就可以过 http://poj.org/problem? ...

  9. py2exe把python程序转换exe

    1.首先下载py2exe:https://sourceforge.net/projects/py2exe/ 2.假设要打包的python 文件放在C:\packet路径下 如 果你有一个名为myscr ...

  10. import information website

    1. 一个很好的展示如何review paper和response to reviewer的网站:openview 该网站给出了许多paper review的例子(如何你是reviewer,那么可以参 ...