题目:
AcWing 25. 剪绳子 - AcWing
代码
主要是处理末尾端几个2,其余都是3,这样相乘能最大,因为4可以分为2*2,3不能分,然后5也没有3*2大,6也没有3*3大。 总之2*2没有3*3大,所以6不能分为2*2*2或1*5.
class Solution {
public:int maxProductAfterCutting(int length) {int a = length/3; //被除数int b = length%3; // 余数if(length == 2) return 1;if(length == 3) return 2;if(length == 4) return 4;if(length == 5) return 6;if(length == 6) return 9;int res = 1;if(b == 1) {res = 4; length -=4;}if(b == 2) {res = 2; length -=2;}int len = length;while(len) {res *= 3;len -= 3;}return res;}
};
代码2
1不用拆,2需要拆成1*1,3拆成2*1 ,4拆成2*2,5拆成2*3,6拆成3*3,7拆成3*2*2,8拆成3*3*2.拆到后面会发现只有2和3.根据不同有一个2或2个2。
算法:
- length<=3 : 拆成 1 * (length - 1)
- length>=4: if(长度%3:余数是2):说明后面只有一个2, res = 2; 长度减去2
- if(长度%3:余数是1) : 说明后面两个2, res = 4; 长度减去4
- 最后只要长度不为0,就不断乘剩下的3.
class Solution {
public:int maxProductAfterCutting(int length) {if(length<=3) return 1*(length-1);int res = 1;int a = length%3;if(a == 1) {res = 4; length -= 4;}if(a == 2) {res = 2; length -= 2;}while(length) {res *= 3;length -= 3;}return res;}
};