有一根长度为length的绳子,length为正整数,问怎样切分绳子才能使切分后每段绳子的乘积最大。比如当length为8时,最优切分为2,3,3,乘积为18。
测试用例:
功能测试:绳子长度大于5
边界测试:绳子长度为0,1,2,3,4
#include<iostream>
#include<math.h>
using namespace std;
int MaxProductAfterCut(int length)
{
if(length<2)return 0;
if(length==2)return 1;
if(length==3)return 2;
int timesof3=length/3;
if(length-timesof3*3==1)
--timesof3;
int timesof2=(length-timesof3*3)/2;
return pow(3,timesof3)*pow(2,timesof2);
}
int main()
{
cout<<MaxProductAfterCut(8)<<endl;
}
注意到当length>=5的时候,任何数都可以分解为加数2和3的和,且2*(length-2)>length,3*(length-3)>length,所以可以将length分解为全为2,3的加数再相乘就是结果,又注意到3*(length-3)>2*(length-2),所以尽可能将length分解为加数3。特殊的,当length=4的时候,1*3<2*2=4,所以length=4的时候不用再分。