求正整数n划分因子乘积最大的一个划分及此乘积
2013-12-22 10:24
295 查看
问题描述:
给定一个正整数n, 则在n所有的划分中, 求因子乘积最大的一个划分及此乘积。
例如:8 = {8}, {7, 1}, {6, 2}, {5, 3}, {4, 4}, {3, 3, 2}, {2, 2, 2, 2} 等,那么在这些当中,3 * 3 * 2 的乘积最大,所以输出整个划分{3,3,2}和这个乘积18.
算法分析:
一个结论:对于一个大于等于4的正整数m,存在一个2块划分的因子,这两个因子的乘积总是不小于原数m本身。
证明如下:
(1)对于任意大于等于4的正整数m, 存在一个划分m = m1+m2, 使 m1*m2 >= m证: 令m1 = int(m/2), 则 m1 >= 2 , m2 = m-m1; 那么m2 > 2,并且 m2 >= m/2 >= m1; m1*m2 >= 2*m2 >= m; 证毕;
(2)由(1)知此数最终可以分解为 2^r * 3^s。现证明 r <= 2;
证:若r > 2, 则至少有3个因子为2, 而2*2*2 < 3*3;
所以可以将3个为2的因子,换为两个因子3;积更大;证毕。
综合(1),(2),则有:任何大于4的因子都可以有更好的分解, 而4可以分解为2*2。
所以:此数应该分解为 2^k1 * 3^k2。而且可以证明 k1>=0 并且 k1 <= 2,因此:
A.当n = 3*r 时, 分解为 3^r
B.当n = 3*r+1时, 分解为 3^(r-1)*2*2
C.当n = 3*r+2时, 分解为 3^r*2
把自然数S(S>1)分拆为若干个自然数的和: S=a1+a2+…+an,则当a1,a2,…,an中至多有两个2,其余都是3时,其连乘积m=a1a2…an有最大值。
例2:把1993分拆成若干个互不相等的自然数的和,且使这些自然数的乘积最大,该乘积是多少?
解:由于把1993分拆成若干个互不相等的自然数的和的分法只有有限种,因而一定存在一种分法,使得这些自然数的乘积最大。
若1作因数,则显然乘积不会最大。把1993分拆成若干个互不相等的自然数的和,因数个数越多,乘积越大。为了使因数个数尽可能地多,我们把1993分成2+3…+n直到和大于等于1993。
若和比1993大1,则因数个数至少减少1个,为了使乘积最大,应去掉最小的2,并将最后一个数(最大)加上1。
若和比1993大k(k≠1),则去掉等于k的那个数,便可使乘积最大。
所以n=63。因为2015-1993=22,所以应去掉22,把1993分成(2+3+…+21)+(23+24+…+63)这一形式时,这些数的乘积最大,其积为 2×3×…×21×23×24×…×63。
给定一个正整数n, 则在n所有的划分中, 求因子乘积最大的一个划分及此乘积。
例如:8 = {8}, {7, 1}, {6, 2}, {5, 3}, {4, 4}, {3, 3, 2}, {2, 2, 2, 2} 等,那么在这些当中,3 * 3 * 2 的乘积最大,所以输出整个划分{3,3,2}和这个乘积18.
算法分析:
一个结论:对于一个大于等于4的正整数m,存在一个2块划分的因子,这两个因子的乘积总是不小于原数m本身。
证明如下:
(1)对于任意大于等于4的正整数m, 存在一个划分m = m1+m2, 使 m1*m2 >= m证: 令m1 = int(m/2), 则 m1 >= 2 , m2 = m-m1; 那么m2 > 2,并且 m2 >= m/2 >= m1; m1*m2 >= 2*m2 >= m; 证毕;
(2)由(1)知此数最终可以分解为 2^r * 3^s。现证明 r <= 2;
证:若r > 2, 则至少有3个因子为2, 而2*2*2 < 3*3;
所以可以将3个为2的因子,换为两个因子3;积更大;证毕。
综合(1),(2),则有:任何大于4的因子都可以有更好的分解, 而4可以分解为2*2。
所以:此数应该分解为 2^k1 * 3^k2。而且可以证明 k1>=0 并且 k1 <= 2,因此:
A.当n = 3*r 时, 分解为 3^r
B.当n = 3*r+1时, 分解为 3^(r-1)*2*2
C.当n = 3*r+2时, 分解为 3^r*2
public int maxsplit(int n){ int maxmultiply =1; if(n<=4){ if(n<=0){ return 0; }else if(n==1||n==2){ return 1; }else if(n==3){ return 2; }else return 4; }else{ int numthree = n/3; if(n%3==0){ for(int i=1;i<=numthree;i++){ maxmultiply = 3*maxmultiply; } } else if(n%3==1){ for(int i=0;i<numthree;i++){ maxmultiply=3*maxmultiply; } maxmultiply =maxmultiply*2*2; }else if(n%3==2){ for(int i=0;i<numthree;i++){ maxmultiply=3*maxmultiply; } maxmultiply =maxmultiply*2; } return maxmultiply; } }将上述结论推广为一般情形便是:
把自然数S(S>1)分拆为若干个自然数的和: S=a1+a2+…+an,则当a1,a2,…,an中至多有两个2,其余都是3时,其连乘积m=a1a2…an有最大值。
例2:把1993分拆成若干个互不相等的自然数的和,且使这些自然数的乘积最大,该乘积是多少?
解:由于把1993分拆成若干个互不相等的自然数的和的分法只有有限种,因而一定存在一种分法,使得这些自然数的乘积最大。
若1作因数,则显然乘积不会最大。把1993分拆成若干个互不相等的自然数的和,因数个数越多,乘积越大。为了使因数个数尽可能地多,我们把1993分成2+3…+n直到和大于等于1993。
若和比1993大1,则因数个数至少减少1个,为了使乘积最大,应去掉最小的2,并将最后一个数(最大)加上1。
若和比1993大k(k≠1),则去掉等于k的那个数,便可使乘积最大。
所以n=63。因为2015-1993=22,所以应去掉22,把1993分成(2+3+…+21)+(23+24+…+63)这一形式时,这些数的乘积最大,其积为 2×3×…×21×23×24×…×63。
相关文章推荐
- 求正整数n划分因子乘积最大的一个划分及此乘积
- 一个整数的所有因子乘积
- 给定一个正整数n,则在n所有的分解式中,求因子乘积最大的一个分解及此乘积。
- 有一个整数n,将n分解成若干个整数之和,问如何分解能使这些数的乘积最大,输出这个乘积m
- 将一个整数拆分使其乘积最大
- 给一个整数N,N可以拆分出不同的因子,而且满足因子的乘积等于N。则在这些因子中和是最小的一组是什么
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 贪心算法——输入任意一个正整数N,将其分成多个互不相同的整数,和为N,乘积最大
- 拼多多笔试题一:给出一个无序整数数组,求任意三个数的最大乘积
- Hulu实习面试题--对一个数进行划分,求最大乘积
- vijos p1347(最大乘积(整数划分?))(25—100分)
- 343. Integer Break (划分整数使乘积最大)
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- Leetcode - Dynamic Programming - 343. Integer Break(划分整数得到最大乘积)
- NYOJ 746 - 正整数n划分为m段,求m段的最大乘积 【区间DP】
- N个整数,求其中任意N-1个数的乘积中的最大的一个
- PAT 1096. Consecutive Factors (20)(最大连续乘积因子)(sqrt(n)判断一个数是否为质数的深刻理解)
- 区间DP——整数划分(使乘积最大)
- 第一题:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?
- 返回一个二维整数数组中最大联通子数组的和