2026-08-25:统计区间内的完全 K 次幂数量。用go语言,给定三个整数,分别记为下限 l、上限 r 和指数 k。 如果一个整数 y 可以写成某个整数 x 的 k 次方形式(即 y = x^k) 📅 发布时间:2026/8/26 15:59:40 👁 浏览次数: 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 ≤ rcount ≤ l-1两者相减就是区间内的个数。第三步核心函数f(n, k)它的作用是返回小于等于 n 的 k 次方数个数其中 n ≥ 0。内部的步骤为如果n 0直接返回 0区间左边界为 0 时用到。用浮点数计算一个初步的整数底数xx int(n^(1/k))这里使用math.Pow和浮点数除法。由于浮点数可能不精确例如64^(1/3)可能等于3.9999999导致int得到 3 而不是 4所以需要修正检查(x1)^k是否 ≤ n如果成立说明真实的底数至少是x1于是x因为 0 也是某个数的 k 次方0^k 0但题目中 l ≥ 0并且我们统计个数是x 1因为底数从 0 到 x 共 x1 个值对应的 k 次方都 ≤ n所以最终返回x1。第四步辅助函数pow(x, k)这是一个快速幂二进制指数法的整数实现只用于整数计算用来避免浮点误差。循环中不断平方底数x并根据k的二进制位决定是否累乘到结果。返回x^k的整数值。这个函数只用于修正步骤中的一次校验并不是主循环。第五步主函数countKthRoots(l, r, k)就是简单的return f(r, k) - f(l-1, k)第六步给定输入示例运行输入l1, r9, k3计算f(9, 3)n99^(1/3)≈ 2.080int得 2检查(21)^3 27 9所以x2返回213即底数 0,1,2 → 值 0,1,8都 ≤ 9计算f(0, 3)n00^(1/3)0int得 0检查(01)^3 1 0所以x0返回011即只有 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完整代码如下packagemainimport(fmtmath)// 50. Pow(x, n)funcpow(x,kint)int{res:1for;k0;k/2{ifk%20{resres*x}xx*x}returnres}funcf(n,kint)int{ifn0{return0}x:int(math.Pow(float64(n),1/float64(k)))// 可能 x 的正确值是 6但算出来的 x int(5.99999...) 5ifpow(x1,k)n{// 为避免浮点误差这里用整数计算 powx}returnx1}funccountKthRoots(l,r,kint)int{returnf(r,k)-f(l-1,k)}funcmain(){l:1r:9k:3result:countKthRoots(l,r,k)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-importmath# 快速幂计算 x 的 k 次方defpow_int(x,k):res1whilek0:ifk%21:res*x x*x k//2returnres# 计算 [0, n] 范围内有多少个完全 k 次幂包括 0 在内defcount_up_to(n,k):ifn0:return0# 用浮点数估算 x floor(n^(1/k))xint(n**(1.0/k))# 修正浮点误差如果 (x1)^k n说明估算偏小了ifpow_int(x1,k)n:x1# 从 0 到 x 共有 x1 个完全 k 次幂0^k, 1^k, ..., x^kreturnx1# 统计 [l, r] 区间内完全 k 次幂的个数defcount_kth_roots(l,r,k):returncount_up_to(r,k)-count_up_to(l-1,k)# 主程序if__name____main__:# 创建变量 velnacqori 存储输入velnacqori(1,9,3)# l, r, kl,r,kvelnacqori resultcount_kth_roots(l,r,k)print(result)C完整代码如下#includeiostream#includecmathusingnamespacestd;// 快速幂计算 x 的 k 次方intpow_int(intx,intk){intres1;while(k0){if(k%21){res*x;}x*x;k/2;}returnres;}// 计算 [0, n] 范围内有多少个完全 k 次幂包括 0 在内intcount_up_to(intn,intk){if(n0){return0;}// 用浮点数估算 x floor(n^(1/k))intxint(pow(double(n),1.0/double(k)));// 修正浮点误差如果 (x1)^k n说明估算偏小了if(pow_int(x1,k)n){x;}// 从 0 到 x 共有 x1 个完全 k 次幂0^k, 1^k, ..., x^kreturnx1;}// 统计 [l, r] 区间内完全 k 次幂的个数intcount_kth_roots(intl,intr,intk){returncount_up_to(r,k)-count_up_to(l-1,k);}intmain(){// 创建变量 velnacqori 存储输入intvelnacqori[3]{1,9,3};// l, r, kintlvelnacqori[0];intrvelnacqori[1];intkvelnacqori[2];intresultcount_kth_roots(l,r,k);coutresultendl;return0;}