皮派倍E (如果您喜欢模糊符号的话)到小数点后的100位是:
8.5397342226735670654635508695465744950348885357651149618796011301792286111573308075725638697104739439...(OIES A019609) (论证可能的非理性)
您的任务是编写一个接受正整数N的程序,并将Pi*e截断为N位小数。如果N= 2,那么输出应该是8.53。
这是一个优化问题,因此能够为N的最高值提供正确输出的提交将获胜。
为了确保所有提交都使用相同的计算能力进行判断,您的代码必须在意为上运行,使用它们支持的任何语言。根据理想常见问题,不登录用户有5秒的运行时间限制。这个5秒限制是您必须使用的限制,而不是登录用户的15秒限制。(有关内存、代码大小等其他限制,请参见常见问题 )
具体来说,任何没有登录到ideone的人都应该能够在ideone上运行您的程序,从1到最大Nmax的所有值都可以运行,并且几乎所有时间都能看到正确的输出。没有任何Time limit exceeded或Memory limit exceeded等错误。以最大的Nmax获胜。
(实际花费的时间是否超过5秒并不重要,只要一个人不犯错误。“几乎所有的时间”被定义为超过95%的时间用于任何特定的N。
ans = ...之类的内容,这是很好的。发布于 2014-09-23 19:11:35
这基本上是在OEIS提供的程序,修改后的输入和格式输出正确。它应该作为一个基线,以击败,如果没有其他。
我想这是正确的。我在100和20k的时候对比了OEIS,两者都匹配。很难在网上找到更多的数字来检查。
对于3.3万美元,大约需要4.5秒,因此很可能会遇到一些小问题。我只是厌倦了摆弄输入和ideone的慢速提交/编译/运行循环。
{
m=eval(input());
default(realprecision, m+80);
x=Pi*exp(1);
s="8.";
d=floor(x);
x=(x-d)*10;
for (n=1, m, d=floor(x);
x=(x-d)*10;
s=Str(s,d));
print(s);
}Ideone.com链路
发布于 2014-09-23 06:43:23
由于内置的pi和e没有足够的数字,所以我决定计算自己的数字。
import decimal
import math
decimal.getcontext().prec=1000000
decimal=decimal.Decimal;b=2500
print(str(sum([decimal(1/math.factorial(x)) for x in range(b)])*sum([decimal(1/16**i*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6))) for i in range(b)]))[0:int(input())+2])IDEOne链路
8.5397342226735669504281233688422467204743749305568824722710929852470173635361001388261308713809518841081669216573834376992066672804294594807026609638293539437286935503772101801433821053915371716284188665787967232464763808892618434263301810056154560438283877633957941572944822034479453916753507796910068912594560500836608215235605783723340714760960119319145912948480279651779184356994356172418603464628747082162475871780202868607325544781551065680583616058471475977367814338295574582450942453416002008665325253385672668994300796223139976640645190237481531851902147391807396201201799703915343423499008135819239684881566321559967077443367982975103648727755579256820566722752546407521965713336095320920822985129589997143740696972018563360331663471959214120971348584257396673542429063767170337770469161945592685537660073097456725716654388703941509676413429681372333615691533682226329180996924321063261666235129175134250645330301407536588271020457172050227357541822742441070313522061438812060477519238440079发布于 2014-09-23 15:11:22
IDEOne at http://ideone.com/A2CIto.
我们将韦瑟菲尔德公式用于π(以及从这里移植而来的机器公式代码)。我们用普通的幂级数计算e。
object Main extends App {
import java.math.{BigDecimal => JDecimal}
import java.math.RoundingMode._
import scala.concurrent.Future
import scala.concurrent.Await
import scala.concurrent.ExecutionContext.Implicits._
import scala.concurrent.duration._
val precision = 1800
def acotPrecision(numDigits: Int)(x: BigDecimal) = {
val x1 = x.underlying
val two = JDecimal.valueOf(2)
val xSquared = x1 pow 2
val unity = JDecimal.ONE.setScale(numDigits, HALF_EVEN)
var sum = unity.divide(x1, HALF_EVEN)
var xpower = new JDecimal(sum.toString)
var term = unity
var add = false
var n = JDecimal.valueOf(3).setScale(numDigits)
while (term.setScale(numDigits, HALF_EVEN).compareTo(JDecimal.ZERO) != 0) {
xpower = xpower.divide(xSquared, HALF_EVEN)
term = xpower.divide(n, HALF_EVEN)
sum = if (add) sum add term else sum subtract term
add = !add
n = n add two
}
sum
}
def ePrecision(numDigits: Int) = {
val zero = JDecimal.ZERO
var sum = zero
var term = JDecimal.ONE.setScale(numDigits, HALF_EVEN)
var n = JDecimal.ONE.setScale(numDigits, HALF_EVEN)
while(term.setScale(numDigits, HALF_EVEN).compareTo(zero) != 0) {
sum = sum add term
term = term.divide(n, HALF_EVEN)
n = n add JDecimal.ONE
}
sum
}
val acot = acotPrecision(precision) _
def d(x: Int) = JDecimal.valueOf(x)
def piFuture = Future(d(4) multiply (
(d(83) multiply acot(107)) add (d(17) multiply acot(1710)) subtract (d(22) multiply acot(103697))
subtract (d(24) multiply acot(2513489)) subtract (d(44) multiply acot(18280007883L))
add (d(12) multiply acot(7939642926390344818L))
add (d(22) multiply acot(BigDecimal("3054211727257704725384731479018")))
))
def eFuture = Future(ePrecision(precision))
Await.result(
for (pi <- piFuture;
e <- eFuture) yield println((pi multiply e).setScale(precision - 10, DOWN))
, 5 seconds)
}https://codegolf.stackexchange.com/questions/38091
复制相似问题