您的位置:首页 > 其它

最大乘积问题

2017-07-17 20:19 204 查看
/*给定一个序列 序列内部数字自由组合 求最大乘积*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#define T 30
//30为数组最大长度
void quick_sort(int s[], int l, int r)
{
int i, j, x;
if (l < r)
{
i = l;
j = r;
x = s[i];
while (i < j)
{
while (i < j && abs(s[j]) > abs(x))
j--; /* 从右向左找第一个绝对值小于x的数 */
if (i < j)
s[i++] = s[j];

while (i < j && abs(s[i]) < abs(x))
i++; /* 从左向右找第一个绝对值大于x的数 */
if (i < j)
s[j--] = s[i];

}
s[i] = x;
quick_sort(s, l, i - 1); /* 递归调用 */
quick_sort(s, i + 1, r);
}
}

int main()
{
int d,M=0;//M为组号
int maray[T];//负数数组
int paray[T];//正数数组
int aray[T];//输入的数组
while(scanf("%d",&d)!=EOF&&d<=T){
int j=0,k=0,mnum=0,pnum=0;//j为负数数组下标 k为正数数组下标 mnum为负数总数 pnum为正数总数
long long pmax=1;//最大乘积
long long mmax=1;//定义负数最大乘积
memset(maray,0,sizeof(maray));
memset(paray,0,sizeof(paray));
memset(aray,0,sizeof(aray));
for (int i = 0; i < d; i++)
{
scanf("%d",&aray[i]);
if (aray[i]<0)
{
maray[j]=aray[i];
mmax*=maray[j]; //求负数最大乘积
j++;
mnum++;

}
else if (aray[i]>0)
{
paray[k]=aray[i];
pmax*=paray[k]; //求正数最大乘积
k++;
pnum++;
}

}
if (mnum%2!=0)
{
if (mnum==1)
{
mmax=1;
}
else{
quick_sort(maray,0,j-1);
mmax=mmax/maray[0];
}
}

pmax*=mmax;

if ((pnum==0&&mnum==1)||(pnum==0&&mnum==0))
{
pmax=0;
}
M++;
printf("Case #%d: The maximum product is %lld.\n\n",M,pmax);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: