首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求最大整数n的最快方法是n!有m位的长度

求最大整数n的最快方法是n!有m位的长度
EN

Code Review用户
提问于 2018-01-16 11:47:53
回答 2查看 393关注 0票数 3

安特尔公司( Factstone基准 Amtel )宣布,将在2010年前推出128位计算机芯片,到2020年发布一台256位计算机,以此类推,继续其每十年将字数翻一番的战略。(Amtel在2000年发布了64位计算机,1990年发布了32位计算机,1980年发布了16位计算机,1970年发布了8位计算机,1960年发布了第一台4位计算机。)Amtel将使用一个新的基准-- Factstone --来宣传其新芯片的巨大改进能力。Factstone评级定义为最大整数\$n\$,这样\n!\$可以表示为计算机字中的无符号整数。如果是1960年\le 2160美元,那么Amtel最近发布的芯片的Factstone评级是多少?输入有几个测试用例。对于每个测试用例,有一行包含\$y\$的输入。包含\$0\$的行在最后一个测试用例后面。>每个测试用例的输出,输出一行,给出Factstone评级。样本输入1 1960 1981 0样本输出1 3 8

代码语言:javascript
运行
复制
import math
n = int(input())
while n != 0:
    n = (n - 1960) / 10 + 2
    m = pow(2,n)
    i = 1
    while m > 0:
        m -= math.log(i,2)
        i += 1
    print(i - 2)
    n = int(input())

有人能帮我优化一下这段代码吗?我这样做的网站,检查我的代码,但我总是失败的时候检查。

EN

回答 2

Code Review用户

发布于 2018-01-16 15:19:43

导入数学n=int(输入())而n != 0: n=(n-1960)/ 10 +2

n现在代表什么?n作为在任务描述中被称为y的值的名称已经不必要地模糊了,但是将它混在一起确实会使事情变得混乱。

此外,请注意,在Python中,/做浮点除法。如果1969的输出应该与1960的输出相同(我确信规范要求),那么这里有一个bug。

m = pow(2,n)

m代表什么?如果您希望人们检查您的代码,请使用描述性名称!

while m > 0: m -= math.log(i,2) i += 1

这个循环为最大可能的输入执行了多少次?怎样才能避免线性回路?(提示:某个Stirling被分析\\log n!\\.)

(或者,可以说是作弊,但只有21年的时间,所以你可以硬编码一个查找。)

票数 6
EN

Code Review用户

发布于 2018-01-16 15:03:21

你需要使用一些数学。

你想知道是否

$n!< 2^b\$ (其中b是位数)

这相当于:

\ \log n!\lt \log 2^b\\log n!\lt \log 2\$

那我们就需要高效的\\log n!\\计算。

\ \log n!\$ = \$\log (n(n-1)!)\$ =\\log n+\log(n-1)!

我们可以为第一个log n!预先计算一些n

最大年份=2160年,等于一台4194304位计算机。

在我努力的过程中,我看到你需要很多预先计算好的log n!,所以我们需要一种更好的计算log n!的方法。当选择log为自然对数ln时,存在一个解决方案:http://mathworld.wolfram.com/StirlingsApproximation.html

它指出:

\ n!≈n \ln +1 \$ (代表大n)

所以我们需要解决:

N+1

对于小n,我们仍然可以使用查找表。您可以确定错误在哪里变得足够小,可以停止使用查找表。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/185210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档