我在Google Code Jam中读到一个关于牛眼的问题。(比赛现在结束了,所以可以谈论它)
玛丽亚从t毫升黑色油漆开始,她将用它来画1厘米厚的戒指。厚度为1cm的圆环是半径相差1cm的两个同心圆之间的空间。
玛丽亚画了第一个黑色的环周围半径为r厘米的白色圆圈。
半径为1cm的圆盘面积为πcm2。需要一毫升油漆覆盖面积πcm2。玛丽亚最多能画多少个黑戒指?
根据我在纸上的计算,画一个有n个环的牛头犬的油漆面积,内径r,作为pi的倍数是2*n**2n*(2*r-1)
所以给定t*pi
millitre的油漆,问题是找到最大的n,使得f(n,r)
今天早上我用二进制搜索解决了这个问题https://github.com/hickford/codejam/blob/master/2013/1A/bullseye/bullseye.py
我选择二元搜索而不是二次方程,因为我非常担心浮点的不精确性——在这个问题中,t和r是10*18的整数。算术上的不精确在上一次代码阻塞中咬了我一口。
但是我很好奇。你能支持二次方程来给出大整数系数方程的正确答案吗?像Sympy或Numpy这样的数学图书馆能给我提供什么吗?
证明二次方程对大输入给出错误答案。例如,使用
r=308436464205151562
和t=1850618785230909388
。要解的二次方程是
2*n**2 + 616872928410303123*n -1850618785230909388 <= 0
即系数为
a = 2
b = 616872928410303123
c = -1850618785230909388
Python中的计算
> int((-b + math.sqrt(b**2 - 4*a*c)) / (2*a))
0
这是错误的答案!正确答案(通过二进制搜索找到)是3
>>> n = 3
>>> 2*n**2 + 616872928410303123*n -1850618785230909388 <= 0
True
如果(t/r^2)
在这个问题上,舍入的精确性让我丧命。。。但是您可以将所有内容保持在64位整数精度,并对生成的二次方程进行二进制搜索。我在这里概述了我的方法。
对于符号精确操作,有sympy。
如果粘贴以下内容:
a, b, c = 2, 616872928410303123, -1850618785230909388
x = Symbol('x')
int(max(solve(a*x**2 + b*x + c, x)))
这里,你得到3。
[根据OP评论编辑]。
我正在尝试创建一个程序,它将生成斐波那契序列中的数字,直到它找到序列中的1000位数字。我使用的代码运行良好并提供有效的输出,但是,我在检索每个数字的长度时遇到了麻烦;使用我已将转换为并使用方法获取长度,但是,我发现这并没有给出真正的长度,我看不出为什么。 有没有更好的方法来获取的长度?我已经读到了thBigInteger这个问题:在一个可伸缩的方法中计算小数位数 更新运行程序后输出的文本文本为:
我正在寻找Python的第n个根函数/算法,但在发布之前:没有整数根,见鬼 我从哪里至少可以获得一个指南,指导如何编程生成精确的/ 对于(第一个参数是数字,第二个参数是根深度(或其他内容))不返回或的函数。 编辑:所以,你给了我这个解决方案:,当我问这个问题时,我就知道了,但它不适用于,例如,。你不能用有理数来表示,因此给出了不正确的结果
NowCoder 题目描述 给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。 解题思路 下面的讨论中 x 代表 base,n 代表 exponent。<!-- --> 因为 (x*x)n/2 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。 // java public
问题内容: 我试图确定双精度的最大精度是多少。在此链接的可接受答案的注释中,Java中的double保持精度 @PeterLawrey将max precision设置为15。 您如何确定呢? 问题答案: @PeterLawrey表示最大精度为15。 实际上,这根本不是他所说的。他说的是: 双精度有15个小数位 他错了。它们的精度为15个十进制 数字 。 任何数字中的小数位数由其对数10的对数给出。
我试图确定double的最大精度是多少。在这个链接中接受的答案的注释中,Java中的Retain precision with double@PeterLawrey声明max precision In 15。 你如何确定这一点?
本文向大家介绍python如何求解两数的最大公约数,包括了python如何求解两数的最大公约数的使用技巧和注意事项,需要的朋友参考一下 题目: 给定两个自然数,求这两个数的最大公约数。 分析: 单看题目的话,非常简单,我们可以循环遍历自然数,如果能够整除两个自然数,就把这个数记下来,在这些记录中找到最大的一个。 但是这样做有几个缺点:一是做除法计算量比较大,二是遍历所有自然数完全没有必要。另外,如