安特尔公司( 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
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())有人能帮我优化一下这段代码吗?我这样做的网站,检查我的代码,但我总是失败的时候检查。
发布于 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年的时间,所以你可以硬编码一个查找。)
发布于 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,我们仍然可以使用查找表。您可以确定错误在哪里变得足够小,可以停止使用查找表。
https://codereview.stackexchange.com/questions/185210
复制相似问题