最大乘积问题

来源:互联网 发布:手机淘宝怎么用淘口令 编辑:程序博客网 时间:2024/05/21 11:36
/*给定一个序列 序列内部数字自由组合 求最大乘积*/#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;}
原创粉丝点击