前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-03-23:在k进制下,最小多小的num,可以让1~num范围的数拥有1的个数不少于n个?

2022-03-23:在k进制下,最小多小的num,可以让1~num范围的数拥有1的个数不少于n个?

作者头像
福大大架构师每日一题
发布2022-04-13 09:27:56
2500
发布2022-04-13 09:27:56
举报
文章被收录于专栏:福大大架构师每日一题

2022-03-23:在k进制下,最小多小的num,可以让1~num范围的数拥有1的个数不少于n个?

答案2022-03-23:

二分法。

代码用golang编写。代码如下:

代码语言:javascript
复制
package main

import "fmt"

func main() {
  ret := minM(5, 2)
  fmt.Println(ret)
}

func minM(n, k int) int {
  len0 := bits(n, k)
  l := 1
  r := power(k, len0+1)
  ans := r
  for l <= r {
    m := l + ((r - l) >> 1)
    if ones(m, k) >= n {
      ans = m
      r = m - 1
    } else {
      l = m + 1
    }
  }
  return ans
}

func bits(num, k int) int {
  len0 := 0
  for num != 0 {
    len0++
    num /= k
  }
  return len0
}

func power(base, power int) int {
  ans := 1
  for power != 0 {
    if (power & 1) != 0 {
      ans *= base
    }
    base *= base
    power >>= 1
  }
  return ans
}

func ones(num, k int) int {
  len0 := bits(num, k)
  if len0 <= 1 {
    return len0
  }
  offset := power(k, len0-1)
  first := num / offset
  curOne := num%offset + 1
  if first != 1 {
    curOne = offset
  }
  restOne := first * (len0 - 1) * (offset / k)
  return curOne + restOne + ones(num%offset, k)
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2021_12_3_week/Code03_OneCountsInKSystem.java)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档