【问题标题】:"Trim" right zeroes from integral type从整数类型“修剪”右零
【发布时间】:2016-04-15 13:45:48
【问题描述】:

如何从不使用字符串的整数中快速删除尾随零?

例如,1000 必须变为 16789000 必须变为 6789

简单的解决方案是重复以10^max_exponent、...、10000100010010(或相反的顺序)等除以取模,并将其与@987654330 进行比较@。

但是有人可以做得更快吗?

【问题讨论】:

  • 预先制作一个表格,将所有数字映射到它们的值,并删除尾随零。所以table[1000] => 1table[1001] => 1001table[1010] => 101table[6789000] => 6789table[6789001] => 6789001。对于任何数字 N,只需从表中返回第 N 个条目。非常快。
  • @HostileFork 如果 max_number 是 int64_t 类型,即 ~9*10^18 怎么办? :)
  • @vladon - 公平地说,他的方式很快,这正是你所要求的。
  • @vladon - 我知道,我是在讽刺!既然您不想使用查找表或 div/mod,为什么不向我们展示您目前的想法?
  • 更多上下文可能会有所帮助。如果您以 10 为基数而不是计算机的本机以 2 为基数表示每个数字,以及一个额外的标记,您将立即得到答案。这将有助于了解上下文以及如何使用该数字。

标签: algorithm language-agnostic numbers


【解决方案1】:

本质上这是 10 次方的二分查找:

if N mod 100000000 = 0
  N = N div 100000000;
if N mod 10000 = 0  
  N = N div 10000;
if N mod 10000 = 0  
  N = N div 10000;
if N mod 100 = 0
  N = N div 100;
if N mod 10 = 0
  N = N div 10;

【讨论】:

  • 这个解决方案不是和问题中的那个一样,OP希望改进的解决方案吗?
  • @גלעד ברקן 他按顺序使用所有十次幂,19 次操作,但足以使 Log2(19)=5 次操作
  • second N mod 10000 不是多余的吗?
  • @erickson 不是,需要提供幂和 = 19(对于 int64 范围)。
  • 好吧,我在想 32 位。有道理,并且非常类似于二进制尾随零的 Hacker's Delight 解决方案。
【解决方案2】:

如果您对数字取 Log10,您可以算出它有多少位数。使用此信息,您可以以比您的数字大的十的最小幂开始您的除法过程。然后,您可以消除一些 mod 测试和部门。你可以做一个循环来简化代码。

伪代码:

digit_count = log10(num) + 1
pow = 10^digit_count
for (int i = 0; i < digit_count; i++) {
    if (num mod pow == 0) {
      num /= pow
    }
    pow /= 10
}
return num

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 2020-01-18
    • 1970-01-01
    • 2018-02-12
    • 2020-08-16
    • 1970-01-01
    • 2023-02-05
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多