剪绳子(进阶版):最直观的想法是,快速幂加上快速乘法。剪绳子当每一段长度为3时乘积最大,故使用number对3取余得到res,取商得到num,当res等于0直接返回3的num次方,当res等于1则取一个3凑成4即返回3的num-1次方再乘以4,当res等于2直接返回3的num次方再乘以2。但是由于数据较大,故乘方运算要使用快速幂实现,而乘法运算要使用快速乘法即乘法转换为加法计算。具体注释如下面代码所示。
//乘法 long long mod=998244353; // 将乘法转换为加法 计算a乘以b long long fast(long long a,long long b) { long long res=0; a%=mod; b%=mod; while(b) { // b的当前位为1 if(b&1) { res+=a; res%=mod; } b>>=1; a<<=1; // 相当于乘以2 因为b是二进制 b右移对应的a左移 a%=mod; } return res; } // 快速幂运算计算a的b次方 long long quick(long long a,long long b) { // 记录结果 long long res=1; while(b) { //b的当前位为1 将其当前乘入结果 if(b&1) res=fast(res,a); // 底数a向前一位代表进位 即为下一次的底数 a=fast(a,a); // 指数b右移一位 b>>=1; } return res; } long long cutRope(long long number) { // 长度为n分为m段 且m>1 n=2则1*1=1 n=3则1*2=2 if(number<=3) return number-1; long long num=number/3; long long res=number%3; if(res==0) return quick(3,num); else if(res==2) return fast(2,quick(3,num)); return fast(4,quick(3,num-1)); }