【问题标题】:Fastest way to generate number like 66666 when the number of digits is given给定位数时生成 66666 等数字的最快方法
【发布时间】:2016-02-18 01:33:26
【问题描述】:

我有一个有趣的问题,我想生成一个大数字(~30000 位),但它必须是所有相同的数字,例如 66666666666666.......

到目前为止,我已通过以下方式完成此操作:

def fillWithSixes(digits):
    result = 0
    for i in range(digits):
        result *= 10
        result += 6
    return result

但是,这样效率很低,想知道有没有更好的方法?用cpp或java回答也可以。

编辑:

  1. 我们不只是解决666666.....,我希望它对任何数字都是通用的。 7777777777....44444........55555... 怎么样?

  2. 字符串操作更糟糕,从当前的O(n) 复杂度增加到O(n^2)

【问题讨论】:

  • 唯一数字是什么意思....另外,您可以将result 设为字符串并与result += '6' 连接,然后返回int(result),但如果数字和您一样大说,我很确定会达到int的限制
  • 或者,更好的是,只是return int('6'*digits),因为'str'*int = 'strstrstr...'#int times
  • @RNar - python 的 Ints 任意大。 int('6' * 10000) 效果很好。

标签: python random numbers time-complexity


【解决方案1】:

您可以使用公式666...666 = 6/9*(10**n-1),其中 n 是位数。

所以,在 Python 中,你可以这样写

n = int(input())
a = 6 * (10**n - 1) // 9
print(a)

【讨论】:

  • 我发现这比任何其他答案都快 10^5 倍。 +1
  • @pjs 6 * (10**n - 1) / 9
  • @Nick 将6 替换为您想要的数字。 (10**n - 1) / 9 是所需的 1 数,然后可以按任意数字缩放。
【解决方案2】:

您可以使用 ljustrjust

number = 6
amount_of_times_to_repeat = 30000
big_number = int("".ljust(amount_of_times_to_repeat, str(number)))
print big_number

在一行中:

print int("".ljust(30000, str(6)))

或者:

new_number = int("".ljust(30000, str(6)))

【讨论】:

    【解决方案3】:

    生成此类 100000+ 位数字的最快方法是decimal.Decimal()

    from decimal import Decimal as D
    
    d = D('6' * n)
    

    测量结果显示6 * (10**n - 1) // 9O(n*log n),而D('6' * n)O(n)。虽然对于较小的n(小于~10000),前者可能更快。

    Decimal 内部表示直接存储十进制数字。如果您需要打印后面的数​​字; str(Decimal) is much faster than str(int).

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2020-01-19
      • 2020-06-15
      • 1970-01-01
      相关资源
      最近更新 更多