剑指面试题14. 剪绳子 (循环和库函数两种解法,大数问题扩展)

解法1:循环实现

int cuttingRope(int n){
    if (n <= 0)
        return -1;
    
    if (n == 2)
        return 1;
    if (n == 3)
        return 2;
    if (n == 4)
        return 4;
    
    int res  = 1;
    while (n > 4) {
        res *= 3;
        n -= 3;
    }
    res *= n;    //n最后只可能是4,3,2

    return res;
}

如果n引起大数问题,此解法 的变动很小,可参考如下实现:

int cuttingRope(int n){
    if (n <= 0)
        return -1;
    
    if (n == 2)
        return 1;
    if (n == 3)
        return 2;
    if (n == 4)
        return 4;
    
    long long res  = 1;
    while (n > 4) {
        res = (res*3) % 1000000007;
        n -= 3;
    }
    res = (res*n)%1000000007;

    return res;
}

解法2:利用C库函数

int cuttingRope(int n){
    if (n <= 0)
        return -1;

    if (n < 4)
        return n - 1;

    int res  = 1;
    int len3_num  = n/3;
    n %= 3;
    if (n == 0)
        res = (int)pow(3, len3_num);
    else if (n == 1)
        res = (int)pow(3, len3_num - 1)*4;
    else
        res = (int)pow(3, len3_num)*n;

    return res;
}

涉及知识点:C库函数    double pow( double x, double y ):返回x的y次幂。

注:

1:C库函数需要将返回值强制转换,避免隐形转换类型。

2:如果n引起大数问题,需用其他实现重写pow(),此时强制转换返回值已经不管用了,因为数有可能会很大,会截断溢出。

你可能感兴趣的:(每日一题)