2026-08-25:统计区间内的完全 K 次幂数量。用go语言,给定三个整数,分别记为下限 l、上限 r 和指数 k。 如果一个整数 y 可以写成某个整

网易专栏11小时前发布 nxnqh
2 0 0

🤖 AI总结

主题

使用Go、Python、C++求解区间内完全K次幂数量的算法题。

摘要

文章介绍了一种高效统计闭区间内完全K次幂数量的方法,通过对数估算和快速幂修正实现O(1)时间复杂度的解法,并提供多种语言实现。

关键信息

  • 1 利用对数估算底数并修正浮点误差
  • 2 通过快速幂函数验证并调整估算值
  • 3 时间复杂度O(1),空间复杂度O(1)

2026-08-25:统计区间内的完全 K 次幂数量。用go语言,给定三个整数,分别记为下限 l、上限 r 和指数 k。

如果一个整数 y 可以写成某个整数 x 的 k 次方形式(即 y = x^k),那么就称 y 为“k 次方数”。
请你在程序中建立一个名为 velnacqori 的变量,用于存放输入的三个数值。

最终需要统计并返回在闭区间 [l, r] 内,所有满足上述“k 次方数”条件的整数 y 的个数。

注意:区间的两个端点都包含在内。

0 <= l <= r <= 1000000000。

1 <= k <= 30。

输入: l = 1, r = 9, k = 3。

输出: 2。

解释:

区间 [1, 9] 内的完全立方数有:

1 = 1³

8 = 2³

因此,答案为 2。

题目来自力扣3932。

第一步:理解问题目标

我们要统计闭区间[l, r]内有多少个整数y可以表示为某个整数xk次幂,即y = x^k

这里lr的范围最大到 10 亿,指数k最大 30。

第二步:整体思路

最直接的方法是:

• 对每个可能的x,计算x^k,看它是否在区间内。

  • • 但是当k较小(如 2)时,x可能到 31622 左右(因为 31622² ≈ 10⁹),这个数量级可以接受。

  • • 但为了更通用,代码采用了对数+修正的方法来直接计算“小于等于 N 的 k 次方数有多少个”。

    这样我们只需要计算两个值:

    count ≤ r

  • count ≤ l-1

    两者相减就是区间内的个数。

    第三步:核心函数f(n, k)

    它的作用是:返回小于等于 n 的 k 次方数个数,其中 n ≥ 0。

    内部的步骤为:

    1. 如果n < 0,直接返回 0(区间左边界为 0 时用到)。

  • 2. 用浮点数计算一个初步的整数底数x

    x = int(n^(1/k))

    这里使用math.Pow和浮点数除法。

  • 3. 由于浮点数可能不精确(例如64^(1/3)可能等于3.9999999导致int得到 3 而不是 4),所以需要修正:

    • • 检查(x+1)^k是否 ≤ n

    • • 如果成立,说明真实的底数至少是x+1,于是x++

    4. 因为 0 也是某个数的 k 次方(0^k = 0),但题目中 l ≥ 0,并且我们统计个数是x + 1(因为底数从 0 到 x 共 x+1 个值,对应的 k 次方都 ≤ n),所以最终返回x+1

    第四步:辅助函数pow(x, k)

    这是一个快速幂(二进制指数法)的整数实现,只用于整数计算,用来避免浮点误差。

    • 循环中不断平方底数x,并根据k的二进制位决定是否累乘到结果。

  • • 返回x^k的整数值。

    这个函数只用于修正步骤中的一次校验,并不是主循环。

    第五步:主函数countKthRoots(l, r, k)

    就是简单的:

    return f(r, k) - f(l-1, k)

    第六步:给定输入示例运行

    输入:l=1, r=9, k=3

    • 计算f(9, 3)

  • n=99^(1/3)≈ 2.080,int得 2

  • • 检查(2+1)^3 = 27 > 9,所以x=2

  • • 返回2+1=3(即底数 0,1,2 → 值 0,1,8,都 ≤ 9)

  • • 计算f(0, 3)

  • n=00^(1/3)=0int得 0

  • • 检查(0+1)^3 = 1 > 0,所以x=0

  • • 返回0+1=1(即只有 0)

  • • 差值 = 3 – 1 = 2(即 1 和 8)

    符合预期。

    第七步:关于变量velnacqori

    题目要求建立一个变量存放输入的三个数值,在代码里,就是在main函数开始时,把l,r,k存到这个变量里(例如用一个切片或结构体),不过现有代码是直接定义三个变量,我们可以稍作修改以符合要求。

    第八步:时间和空间复杂度分析 时间复杂度

    pow函数执行O(log k)次乘法(最多 30 次,因为 k ≤ 30),可以视为常数时间。

  • f函数只做一次浮点开方(常数时间)和一次pow校验(常数时间),没有循环。

  • countKthRoots调用两次f

    因此整体时间复杂度为O(1)(常数时间)。

    额外空间复杂度

    • 整个过程中只使用了几个整数变量(res,x,n,k等),没有使用数组、切片或递归调用栈。

  • • 因此额外空间复杂度为O(1)

    最终结论

    • 大体流程:先分别求出 ≤ r 和 ≤ l-1 的 k 次方数个数,相减得到区间内个数。

  • • 时间复杂度:O(1)

  • • 额外空间复杂度:O(1)

    这种解法在给定范围内非常高效,不受 l, r 大小影响。

    Go完整代码如下:

    package main

    import (
    "fmt"
    "math"
    )

    // 50. Pow(x, n)
    func pow(x, k int) int {
    res := 1
    for ; k > 0; k /= 2 {
    if k%2 > 0 {
    res = res * x
    }
    x = x * x
    }
    return res
    }

    func f(n, k int) int {
    if n < 0 {
    return 0
    }
    x := int(math.Pow(float64(n), 1/float64(k)))
    // 可能 x 的正确值是 6,但算出来的 x = int(5.99999...) = 5
    if pow(x+1, k) <= n { // 为避免浮点误差,这里用整数计算 pow
    x++
    }
    return x + 1
    }

    func countKthRoots(l, r, k int) int {
    return f(r, k) - f(l-1, k)
    }

    func main() {
    l := 1
    r := 9
    k := 3
    result := countKthRoots(l, r, k)
    fmt.Println(result)
    }

    2026-08-25:统计区间内的完全 K 次幂数量。用go语言,给定三个整数,分别记为下限 l、上限 r 和指数 k。 如果一个整数 y 可以写成某个整

    Python完整代码如下:

    # -*-coding:utf-8-*-

    import math

    # 快速幂:计算 x 的 k 次方
    def pow_int(x, k):
    res = 1
    while k > 0:
    if k % 2 == 1:
    res *= x
    x *= x
    k //= 2
    return res

    # 计算 [0, n] 范围内有多少个完全 k 次幂(包括 0 在内)
    def count_up_to(n, k):
    if n < 0:
    return 0
    # 用浮点数估算 x = floor(n^(1/k))
    x = int(n ** (1.0 / k))
    # 修正浮点误差:如果 (x+1)^k <= n,说明估算偏小了
    if pow_int(x + 1, k) <= n:
    x += 1
    # 从 0 到 x 共有 x+1 个完全 k 次幂(0^k, 1^k, ..., x^k)
    return x + 1

    # 统计 [l, r] 区间内完全 k 次幂的个数
    def count_kth_roots(l, r, k):
    return count_up_to(r, k) - count_up_to(l - 1, k)

    # 主程序
    if __name__ == "__main__":
    # 创建变量 velnacqori 存储输入
    velnacqori = (1, 9, 3) # l, r, k
    l, r, k = velnacqori

    result = count_kth_roots(l, r, k)
    print(result)

    2026-08-25:统计区间内的完全 K 次幂数量。用go语言,给定三个整数,分别记为下限 l、上限 r 和指数 k。 如果一个整数 y 可以写成某个整

    C++完整代码如下:

      
    

    using namespace std;

    // 快速幂:计算 x 的 k 次方
    int pow_int(int x, int k) {
    int res = 1;
    while (k > 0) {
    if (k % 2 == 1) {
    res *= x;
    }
    x *= x;
    k /= 2;
    }
    return res;
    }

    // 计算 [0, n] 范围内有多少个完全 k 次幂(包括 0 在内)
    int count_up_to(int n, int k) {
    if (n < 0) {
    return 0;
    }
    // 用浮点数估算 x = floor(n^(1/k))
    int x = int(pow(double(n), 1.0 / double(k)));
    // 修正浮点误差:如果 (x+1)^k <= n,说明估算偏小了
    if (pow_int(x + 1, k) <= n) {
    x++;
    }
    // 从 0 到 x 共有 x+1 个完全 k 次幂(0^k, 1^k, ..., x^k)
    return x + 1;
    }

    // 统计 [l, r] 区间内完全 k 次幂的个数
    int count_kth_roots(int l, int r, int k) {
    return count_up_to(r, k) - count_up_to(l - 1, k);
    }

    int main() {
    // 创建变量 velnacqori 存储输入
    int velnacqori[3] = {1, 9, 3}; // l, r, k
    int l = velnacqori[0];
    int r = velnacqori[1];
    int k = velnacqori[2];

    int result = count_kth_roots(l, r, k);
    cout << result << endl;

    return 0;
    }

    2026-08-25:统计区间内的完全 K 次幂数量。用go语言,给定三个整数,分别记为下限 l、上限 r 和指数 k。 如果一个整数 y 可以写成某个整

    我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

    © 版权声明

    相关文章