/*
编程之美题,给定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. mysql批量更新、多表更新、多表删除

    本文介绍下,mysql中进行批量更新.多表更新.多表删除的一些实例,有需要的朋友可以参考下. 本节主要内容: mysql的批量更新.多表更新.多表删除 一,批量更新: 复制代码代码示例: update ...

  2. 过滤部分错误信息,不输出到stderr

    cmd 2>/tmp/stderr.log cat /tmp/stderr.log | grep -v “要过滤信息的关键字” >&2 rm /tmp/stderr.log

  3. Python设计模式——模版方法模式

    1.模版方法模式 做题的列子: 需求:有两个学生,要回答问题,写出自己的答案 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class Stude ...

  4. .NET 轻量级 ORM 框架 - Dapper 介绍

    Dapper简单介绍: Dapper is a single file you can drop in to your project that will extend your IDbConnect ...

  5. Memcached(六)Memcached的并发实例

    package com.sinosuperman.memcached; import java.io.IOException; import java.net.InetSocketAddress; i ...

  6. python 进程信息

    通过psutil模块读取机器进程信息: #-*- coding: UTF-8 -*-import psutil;import osimport CommMethod '''获取机器当前进程信息'''d ...

  7. yum和rpm命令详解

    rpm,全称RPM Package Manager,是RedHat发布的,针对特定硬件,已经编译好的软件包.安装之后就可以使用,不需要自行编译,以及之前对软件和硬件的检测,目录的配置等动作. yum, ...

  8. uva 12654

    dp,用优先队列存,上个节点节点覆盖下来的长度: 不过还不是很明白: #include<cstdio> #include<queue> #include<algorith ...

  9. MAC下《暗黑世界》客户端版本编译说明!!

    原地址:http://blog.csdn.net/uxqclm/article/details/11970659 2013-09-24 12:02 161人阅读 评论(0) 收藏 举报   目录(?) ...

  10. unity 与 android 协调工作 注意事项

    原地址:http://blog.csdn.net/u012085988/article/details/17436191 1.unity调android函数 AndroidJavaClass jc = ...