Questions tagged «math»

数学涉及程序中数字的操纵。有关一般数学问题,请在[math.stackexchange.com](https://math.stackexchange.com/)上提问。注意:如果您的问题是关于浮点计算的意外结果,请首先阅读[浮点数学是否已损坏?](https://stackoverflow.com/q/588004/1679849)。


30
确定整数的平方根是否为整数的最快方法
我正在寻找确定一个long值是否为完美平方(即其平方根是另一个整数)的最快方法: 通过使用内置Math.sqrt() 函数,我已经完成了简单的方法,但是我想知道是否有一种方法可以通过将自己限制为仅整数域来更快地完成操作。 维护查找表是不切实际的(因为大约有2 31.5个整数,其平方小于2 63)。 这是我现在做的非常简单明了的方法: public final static boolean isPerfectSquare(long n) { if (n < 0) return false; long tst = (long)(Math.sqrt(n) + 0.5); return tst*tst == n; } 注意:我在许多Project Euler问题中都使用了此功能。因此,没有其他人将不得不维护此代码。这种微优化实际上可能会有所作为,因为挑战的一部分是在不到一分钟的时间内完成每种算法,并且在某些问题中,需要数百万次调用此函数。 我已经尝试过不同的解决方案: 经过详尽的测试后,我发现0.5没有必要将Math.sqrt()的结果添加进去,至少在我的机器上没有。 的平方根倒数快速增快,但它给了不正确的结果对于n> = 410881.然而,所建议BobbyShaftoe,我们可以使用对于n <410881的FISR黑客攻击。 牛顿的方法比慢Math.sqrt()。这可能是因为Math.sqrt()使用了类似于牛顿方法的方法,但是是在硬件中实现的,因此它比Java快得多。同样,牛顿法仍然需要使用双精度。 一种经过改进的牛顿方法,其中使用了一些技巧,以便仅涉及整数数学运算,因此需要一些技巧来避免溢出(我希望此函数与所有正的64位带符号整数一起使用),但它仍然比慢Math.sqrt()。 二进制印章甚至更慢。这是有道理的,因为二进制印章平均需要16次通过才能找到64位数字的平方根。 根据John的测试,or在C ++中,使用语句比使用a更快switch,但是在Java和C#中,or和之间似乎没有区别switch。 我还尝试制作一个查找表(作为64个布尔值的私有静态数组)。然后or,我只是说而不是switch或statement if(lookup[(int)(n&0x3F)]) { test } else …


30
容易的面试问题变得更加困难:给定数字1..100,在恰好缺少k的情况下,找到缺失的数字
前一段时间我有一次有趣的面试经历。这个问题开始很容易: Q1:我们有包含数字的袋子1,2,3,..., 100。每个数字仅出现一次,因此有100个数字。现在,从袋子中随机抽取一个号码。查找丢失的号码。 我当然已经听过这个面试问题,所以我很快就回答了以下问题: A1:好吧,数字的总和1 + 2 + 3 + … + N是(N+1)(N/2)(请参阅Wikipedia:算术级数的总和)。因为N = 100,总和是5050。 因此,如果袋子中所有数字都存在,则总和为5050。由于缺少一个数字,所以总和小于这个数字,而差就是那个数字。因此,我们可以找到O(N)时间和O(1)空间上缺少的数字。 在这一点上,我认为我做得不错,但是突然之间,这个问题突然发生了变化: Q2:是的,但是现在如果缺少两个数字,您将如何处理? 我之前从未见过/听过/考虑过这种变化,所以我感到惊慌,无法回答这个问题。面试官坚持要知道我的思维过程,所以我提到也许我们可以通过与预期产品进行比较来获得更多信息,或者也许在从第一遍收集到一些信息之后再进行第二遍,等等,但是我真的只是在拍摄在黑暗中,而不是真正找到解决方案的清晰途径。 面试官的确通过说第二个方程式确实是解决问题的一种方式来鼓励我。在这一点上,我有点不高兴(因为事先不知道答案),并询问这是否是一种通用的(读作:“有用的”)编程技术,还是仅仅是一个技巧/陷阱。 面试官的回答让我感到惊讶:您可以推广该技术以找到3个缺失的数字。实际上,您可以对其进行概括以找到k个缺失数字。 Qk:如果袋子中恰好缺少k个数字,您将如何有效地找到它? 这是几个月前,但我仍然不知道这种技术是什么。显然存在一个Ω(N)时间下限,因为我们必须至少扫描一次所有数字,但是访调员坚持认为求解技术的TIME和SPACE复杂度(减去O(N)时间输入扫描)以k而非N定义。 所以这里的问题很简单: 您将如何解决Q2? 您将如何解决Q3? 您将如何解决Qk? 澄清说明 通常,从1 .. N开始有N个数字,而不仅仅是1..100。 我不是在寻找明显的基于集合的解决方案,例如,使用位集,通过指定位的值编码每个数字的存在/不存在,因此O(N)在其他空间中使用位。我们无法承受与N成正比的任何额外空间。 我也不在寻找明显的排序优先方法。这种方法和基于集合的方法在采访中值得一提(它们易于实现,并且取决于N,可能非常实用)。我正在寻找“圣杯”解决方案(可能实现或可能不实际,但仍具有所需的渐近特性)。 因此,当然,您必须再次扫描中的输入O(N),但是您只能捕获少量信息(用k而不是N定义),然后必须以某种方式找到k个缺失的数字。
1146 algorithm  math 

16
如何检查NaN值?
float('nan')结果为Nan(不是数字)。但是,如何检查呢?应该很容易,但是我找不到。
979 python  math 




30
设计函数f(f(n))== -n
我上次面试时遇到的一个问题: 设计一个函数f,使得: f(f(n)) == -n n32位有符号整数在哪里?您不能使用复数算法。 如果无法为整个数字范围设计这样的函数,请为最大范围设计。 有任何想法吗?
841 math  integer 

28
了解“随机性”
我无法解决这个问题,哪个更随机? rand() 或: rand() * rand() 我发现它是一个真正的脑筋急转弯,您能帮我吗? 编辑: 凭直觉我知道数学答案将是它们是同样随机的,但是我忍不住想,如果您将两者相乘时两次“运行随机数算法”,那么您将创建的随机性远不止是它一次。

5
如何确定pi的计算是否正确?
我正在尝试各种方法来实现一个程序,该程序顺序给出pi的数字。我尝试了泰勒级数方法,但是事实证明,它收敛非常慢(当我将我的结果与在线值进行比较之后会比较)。无论如何,我正在尝试更好的算法。 因此,在编写程序时,就像所有算法一样,我陷入了一个问题:我怎么知道n我计算出的数字是准确的?


23
如何检查数字是否为2的幂
今天,我需要一种简单的算法来检查数字是否为2的幂。 该算法需要为: 简单 更正任何ulong值。 我想出了这个简单的算法: private bool IsPowerOfTwo(ulong number) { if (number == 0) return false; for (ulong power = 1; power > 0; power = power << 1) { // This for loop used shifting for powers of 2, meaning // that the value will become 0 after the …
584 c#  algorithm  math 



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.