gpt4 book ai didi

python - 数字的第一位数字

转载 作者:太空宇宙 更新时间:2023-11-04 05:25:24 25 4
gpt4 key购买 nike

我想要一个无限循环的斐波诺契数列的前 9 位和后 9 位。单独运行测试,与前 9 位数字相比,我使用模运算符 no 获得了最后 9 位数字的更好结果。我运行了不同的测试,例如 int(str(b)[::-1])%10**9, b/(10**(len(str(b))-9)) 但是还是一样的结果。我认为发生这种情况是因为高位数字到字符串的转换。有没有其他方法可以在不转换为字符串的情况下打印前 9 位数字,或者有/没有字符串的有效方法?

def fibby():
a,b = 1,1
yield [a,a]
yield [b,b]
while True:
a,b = b,a+b
yield [str(b)[:9], b%10**9]

最佳答案

以下是获取前 30000 个前缀的几个版本和时间。为简单起见,我省略了前两位 yield 和最后一位数字。

  • fibby1 是使用 str(b)[:9] 的原始方式。
  • fibby2 跟踪要除以的 10 的适当次方。
  • fibby3 将前 9 位数字保留在 ab 中,其余数字保留在 A 中>B。与 fibby2 相比,这避免了将大的 b 除以 10 的大幂。大数仅被加/减/比较,或与小数相乘。<
  • fibby4 使用@therefromhere 建议的 math.log10
  • fibby5 使用 decimal模块。

输出:

All agree? True
fibby1: 24.835 seconds
fibby2: 0.289 seconds
fibby3: 0.201 seconds
fibby4: 2.802 seconds
fibby5: 0.216 seconds

为了比较,我还尝试了 str(b % 10**9),即最后九位数字,耗时 0.506 秒。这比前九位数字的快速解决方案

代码:

def fibby1():
a, b = 1, 1
while True:
yield str(b)[:9]
a, b = b, a+b

def fibby2():
a, b = 1, 1
div = 1
while True:
while True:
front = b // div
if front < 10**9:
break
div *= 10
yield str(front)
a, b = b, a+b

def fibby3():
a,b = 1,1
A,B,C = 0,0,1
while True:
yield str(b)
a, b = b, a+b
A, B = B, A+B
if B >= C:
B -= C
b += 1
if b >= 10**9:
A += a%10 * C
B += b%10 * C
a //= 10
b //= 10
C *= 10

def fibby4():
from math import log10
a, b = 1, 1
while True:
yield str(b // 10**max(0, int(log10(b) - 8)))
a, b = b, a+b

def fibby5():
from decimal import Decimal, getcontext
getcontext().prec = 7000 # enough for n = 30000
a, b = Decimal(1), Decimal(1)
while True:
yield str(b)[:9]
a, b = b, a+b

from timeit import timeit
from itertools import islice
from time import time

n = 30000
t0 = time()
list1 = list(islice(fibby1(), n))
t1 = time()
list2 = list(islice(fibby2(), n))
t2 = time()
list3 = list(islice(fibby3(), n))
t3 = time()
list4 = list(islice(fibby4(), n))
t4 = time()
list5 = list(islice(fibby5(), n))
t5 = time()
print('All agree?', list1 == list2 == list3 == list4 == list5)
print('fibby1: %6.3f seconds' % (t1 - t0))
print('fibby2: %6.3f seconds' % (t2 - t1))
print('fibby3: %6.3f seconds' % (t3 - t2))
print('fibby4: %6.3f seconds' % (t4 - t3))
print('fibby5: %6.3f seconds' % (t5 - t4))

关于python - 数字的第一位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38937776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com