最大乘积问题
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; }
相关文章推荐
- 贪心算法----正整数分解问题 和相同,乘积最大
- FOJ--1698--最大乘积--解题报告(大数乘小数的问题)
- 最大子串乘积问题
- 乘积最大问题——动态规划
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(动态规划)
- 最大k乘积问题
- 最大K乘积问题(DP专题)
- MOOC清华《程序设计基础》第6章第3题:最大乘积问题(递归法)
- AOJ-190 乘积最大问题
- JAVA代码—算法基础:最大连续子数组乘积问题
- C语言最大的乘积问题
- 算法 最大k乘积问题
- 求最小子序列和,最小的正子序列和,最大子序列乘积问题
- 子数组的最大乘积问题
- 乘积最大问题
- 最大k乘积问题
- 【dp】最大k乘积问题
- 1209 -- 乘积最大问题
- 【动态规划】最大k乘积问题
- FOJ 1208 最大k乘积问题