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可以表示为某个整数x的k次幂,即y = x^k。
这里l和r的范围最大到 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=9,9^(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=0,0^(1/3)=0,int得 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)
}
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 = velnacqoriresult = count_kth_roots(l, r, k)
print(result)
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;
}
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.