N个数的数组求N-1个数组合乘积最大的一组
/*
编程之美题,给定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个数组合乘积最大的一组的更多相关文章
- SPOJ Distinct Substrings(后缀数组求不同子串个数,好题)
DISUBSTR - Distinct Substrings no tags Given a string, we need to find the total number of its dist ...
- SPOJ(后缀数组求不同子串个数)
DISUBSTR - Distinct Substrings Given a string, we need to find the total number of its distinct subs ...
- 75 int类型数组中除了一个数出现一次或两次以外,其他数都出现三次,求这个数。[2行核心代码]
[本文链接] http://www.cnblogs.com/hellogiser/p/single-number-of-array-with-other-three-times.html [题目] i ...
- 输入n个数组,数组长度不等,每个数组取出一个数进行组合,求出所有的组合。
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5511707.html 昨天晚上,有个朋友找到我,他在用matlab编程,但是遇到一个问题,解决不了. 问题如下: ...
- 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。
题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...
- 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, ...
- 求一个数组的最大k个数(java)
问题描写叙述:求一个数组的最大k个数.如,{1,5,8,9,11,2,3}的最大三个数应该是,8,9,11 问题分析: 1.解法一:最直观的做法是将数组从大到小排序,然后选出当中最大的K个数.可是这种 ...
- POJ 3978 Primes(求范围素数个数)
POJ 3978 Primes(求范围素数个数) id=3978">http://poj.org/problem? id=3978 题意: 给你一个区间范围A和B,要你求出[A,B]内 ...
- 在数组中找几个数的和等于某个数[LeetCode]
首先明确一点,这个方面的问题设计到的知识点是数组的查找的问题.对于类似的这样的查找操作的具体办法就是三种解决方法: 1.暴力算法,多个for循环,很高的时间复杂度 2.先排序,然后左右夹逼,但是这样会 ...
随机推荐
- css3 回到顶部书写
回到顶部 JS 代码 backTop = function(){ if(!document.querySelector("#backTop")){return;} ...
- [HTML] <input> 标签
可选的属性 属性 值 描述 accept mime_type 规定通过文件上传来提交的文件的类型. align left right top middle bottom 不赞成使用.规定图像输入的 ...
- OpenSessionInViewFilter与org.springframework.dao.InvalidDataAccessApiUsageException
报错:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r ...
- python正则的中文处理
因工作需要,要查找中文汉字分词,因为python正则表达式\W+表示的是所有的中文字就连标点符号都包括.所以要想办法过滤掉. 参考博客:http://log.medcl.net/item/2011/0 ...
- 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 ...
- windows下STM32开发环境的搭建
一.概述 1.说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改 ...
- c语言通过89C51驱动1602液晶显示(入门级别)
工具proteus,keil 步骤: 1.画好电路图 2.在指令模式下,设置好显示模式以及光标位置 3.在写数据模式下,向1602写入显示字符(1602只能显示数字和字符) 电路图 #include ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- py2exe把python程序转换exe
1.首先下载py2exe:https://sourceforge.net/projects/py2exe/ 2.假设要打包的python 文件放在C:\packet路径下 如 果你有一个名为myscr ...
- import information website
1. 一个很好的展示如何review paper和response to reviewer的网站:openview 该网站给出了许多paper review的例子(如何你是reviewer,那么可以参 ...