最大乘积问题

时间:2021-01-03 01:36:42
/*给定一个序列 序列内部数字*组合 求最大乘积*/
#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;
}