小学奥数题
给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n 都是整数,2≤n≤58 并且 m≥2
)。
每段的绳子的长度记为 k[1]、k[2]、……、k[m]
。
k[1]k[2]…k[m]
可能的最大乘积是多少?
例如当绳子的长度是 8
时,我们把它剪成长度分别为 2、3、3 的三段,此时得到最大的乘积 18
。
样例
输入:8
输出:18
/**
* 一个数学题 N > 0, N = n1 + n2 + ... + nk
* 反证法:
* 1. 假设 ni >= 5, 3 * (ni - 3) >= ni ? 3ni - 9 >= ni ? 2ni >= 9? ==> 证明所有的数一定小于5
* 2. ni = 4, 4 = 2 * 2 ==> 证明可以没有4
* 3. 2 * 2 * 2 < 3 * 3 ==> 证明里面最多只有2个2
*
*
* 1. 如果可以整除3,拆分为若干个3
* 2. 如果余1, 先拆出来2个2,剩下的拆成3
* 3. 如果余2, 先拆出来1个2,剩下的拆成3
*/
class Solution {
public int maxProductAfterCutting(int n)
{
if (n <= 3) return 1 * (n - 1);
int res = 1;
if (n % 3 == 1) {
res *= 4;
n -= 4;
}
if (n % 3 == 2) {
res *= 2;
n -= 2;
}
while (n > 0) {
res *= 3;
n -= 3;
}
return res;
}
}