剑指Offer-13剪绳子

96 阅读1分钟
public static int cuttingRope(int n) {
    BigInteger max = BigInteger.valueOf(0);
    for (int i = 2; i<= n; i++){
        //这题就很脑筋急转弯 就是均分的情况下乘积最大
        max = max.max(cutting(n, i));
    }
    return max.remainder(BigInteger.valueOf(1000000007)).intValue();
}

public static BigInteger cutting(int n, int m){
    // 每段的长度 只能是整数
    BigInteger length = BigInteger.valueOf(n / m);
    // 剩余的长度
    int reduce = n % m;
    // 因为存在剩余长度且不大于m 根据平均分乘积最大的原理 有reduce根绳子+1做到最平均 得到下面的式子
    return length.pow(m - reduce).multiply(length.add(BigInteger.valueOf(1)).pow(reduce));
}

不会有人比我疯狂了吧

保持和上一题一样的思路,换成大数操作BigInteger,效率极低

 

参考了最佳答案 数学证明自行百度  记住答案就行了

/**
 * 这个据数学证明:当n>=3时因数拆分成3的计算结果较大、当n<3时因数越大,结果越大
 * @author Lucas
 * @date 2021/02/07 22:51
 * @param n 段数
 * @return int
 */
public static int cuttingRope(int n) {
    if (n <= 3) {
        return n-1;
    }
    long res = 1;
    while(n > 4){
        res = res *3 % 1000000007;
        n -= 3;
    }
    return (int)(res * n % 1000000007);
}