前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1,

2023-06-24:给你一根长度为 n 的绳子, 请把绳子剪成整数长度的 m 段, m、n都是整数,n > 1并且m > 1,

作者头像
福大大架构师每日一题
发布2023-07-08 17:35:08
1860
发布2023-07-08 17:35:08
举报
文章被收录于专栏:福大大架构师每日一题

2023-06-24:给你一根长度为 n 的绳子,

请把绳子剪成整数长度的 m 段,

m、n都是整数,n > 1并且m > 1,

每段绳子的长度记为 k[0],k[1]...k[m - 1]。

请问 k[0]k[1]...*k[m - 1] 可能的最大乘积是多少?

例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

答案需要取模1000000007。

输入: 10。

输出: 36。

答案2023-06-24:

具体步骤如下:

1.如果n <= 3,返回n-1。

2.如果n > 3,计算剩下绳子长度为n - 4,此时剩下的长度为4。

3.如果剩下的长度为0,即n为3的倍数,最后一段长度为1;如果剩下的长度为2,最后一段长度为2;如果剩下的长度为4,最后一段长度为4。

4.计算3的个数,即rest = n - (剩下的长度);计算最后一段的长度last。

5.利用快速幂算法计算3的rest/3次方取mod后的结果,记为power(3, rest/3)。

6.返回(power(3, rest/3) * last) % mod作为最大乘积的结果。

例如,当n为10,按照上述步骤计算:

1.n > 3且不是3的倍数,剩下的长度为2,最后一段长度为2。

2.计算3的个数,rest = n - 2 = 8。

3.计算power(3, rest/3) = power(3, 8/3)。

4.返回(power(3, 8/3) * 2) % mod,计算结果为36,即最大乘积。

因此,输入为10,输出为36。

该代码的时间复杂度为O(log(n)),空间复杂度为O(1)。

在函数power中,通过快速幂算法计算x的n次方,时间复杂度为O(log(n))。在函数cuttingRope中,没有使用任何循环或递归,只有一些简单的判断和计算操作,因此时间复杂度为O(1)。

对于空间复杂度,代码只使用了常数级别的额外空间来存储变量,因此空间复杂度为O(1)。不随输入规模的增加而增加。

go完整代码如下:

代码语言:javascript
复制
package main

import "fmt"

const mod = 1000000007

// power计算x的n次方,取mod后的结果
func power(x int, n int) int {
    ans := int64(1)
    x64 := int64(x)
    n64 := int64(n)

    for n64 > 0 {
        if n64&1 == 1 {
            ans = (ans * x64) % mod
        }
        x64 = (x64 * x64) % mod
        n64 >>= 1
    }

    return int(ans)
}

// cuttingRope根据观察得到的规律计算绳子的最大乘积
func cuttingRope(n int) int {
    if n == 2 {
        return 1
    }
    if n == 3 {
        return 2
    }

    rest := 0
    last := 0

    if n%3 == 0 {
        rest = n
        last = 1
    } else if n%3 == 1 {
        rest = n - 4
        last = 4
    } else {
        rest = n - 2
        last = 2
    }

    return (power(3, rest/3) * last) % mod
}

func main() {
    n := 10
    result := cuttingRope(n)
    fmt.Println("Result:", result)
}

在这里插入图片描述

rust完整代码如下:

代码语言:javascript
复制
const MOD: i32 = 1_000_000_007;

fn power(x: i32, n: i32) -> i32 {
    let mut ans: i64 = 1;
    let mut x: i64 = x as i64;
    let mut n: i64 = n as i64;

    while n > 0 {
        if n & 1 == 1 {
            ans = (ans * x) % MOD as i64;
        }
        x = (x * x) % MOD as i64;
        n >>= 1;
    }

    ans as i32
}

fn cutting_rope(n: i32) -> i32 {
    if n == 2 {
        return 1;
    }
    if n == 3 {
        return 2;
    }

    let rest = if n % 3 == 0 { n } else if n % 3 == 1 { n - 4 } else { n - 2 };
    let last = if n % 3 == 0 { 1 } else if n % 3 == 1 { 4 } else { 2 };

    ((power(3, rest / 3) as i64 * last as i64) % MOD as i64) as i32
}

fn main() {
    let n = 10;
    let result = cutting_rope(n);
    println!("Result: {}", result);
}

在这里插入图片描述

c++代码如下:

代码语言:javascript
复制
#include <iostream>
using namespace std;

const int mod = 1000000007;

// power计算x的n次方,取mod后的结果
long long power(long long x, int n) {
    long long ans = 1;
    while (n > 0) {
        if ((n & 1) == 1) {
            ans = (ans * x) % mod;
        }
        x = (x * x) % mod;
        n >>= 1;
    }
    return ans;
}

// cuttingRope根据观察得到的规律计算绳子的最大乘积
int cuttingRope(int n) {
    if (n == 2) {
        return 1;
    }
    if (n == 3) {
        return 2;
    }

    int rest = 0, last = 0;

    if (n % 3 == 0) {
        rest = n;
        last = 1;
    }
    else if (n % 3 == 1) {
        rest = n - 4;
        last = 4;
    }
    else {
        rest = n - 2;
        last = 2;
    }

    return (int)((power(3, rest / 3) * last) % mod);
}

int main() {
    int n = 10;
    int result = cuttingRope(n);
    cout << "Result: " << result << endl;
    return 0;
}

在这里插入图片描述

c完整代码如下:

代码语言:javascript
复制
#include <stdio.h>

const int mod = 1000000007;

// power计算x的n次方,取mod后的结果
long long power(long long x, int n) {
    long long ans = 1;
    while (n > 0) {
        if ((n & 1) == 1) {
            ans = (ans * x) % mod;
        }
        x = (x * x) % mod;
        n >>= 1;
    }
    return ans;
}

// cuttingRope根据观察得到的规律计算绳子的最大乘积
int cuttingRope(int n) {
    if (n == 2) {
        return 1;
    }
    if (n == 3) {
        return 2;
    }

    int rest = 0, last = 0;

    if (n % 3 == 0) {
        rest = n;
        last = 1;
    }
    else if (n % 3 == 1) {
        rest = n - 4;
        last = 4;
    }
    else {
        rest = n - 2;
        last = 2;
    }

    return (int)((power(3, rest / 3) * last) % mod);
}

int main() {
    int n = 10;
    int result = cuttingRope(n);
    printf("Result: %d\n", result);
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 具体步骤如下:
  • go完整代码如下:
  • rust完整代码如下:
  • c++代码如下:
  • c完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档