1
3
通常一个分支的成本比乘法的成本还高,所以除了这个之外,想变得聪明是不值得的。如果所指的整数是int32,则升级到int64以执行乘法;如果所指的整数较大,则需要使用常用机制管理乘法,此时有关分支的假设可能会失效。 |
2
4
在一般情况下,不是。如果你想做很多比较,一个初步的处理步骤可以把所有的东西都规范化(把分子和分母除以它们的gcd,使分母为正),这样平等比较就会比较a=c和b=d,但是,计算a*d=b*c绝对不是禁止的。 |
3
4
如果需要复杂的解决方案,请将这两个分数中的每一个转换为连续分数(使用GCD算法的变体)。这个简单的算法一次生成一个整数。比较两个部分连分数中的每一对整数。如果它们不同,退出。否则,生成下一对并在有更多对时继续。 对于有理数,序列是有限的,所以它很快就会终止。 我相信这是当a,b,c,d很大的时候最好的方法。 证明了所有非有理平方根的连分式展开式都是递归的。所以你也可以用这个来比较那些非理性的,即使它们的二进制计算机表示会给你一个错误的结果(由于截断)。 这意味着一旦你检测到模式中的重复,你就可以终止,证明两个非理性的相等。 |
4
2
在我看来,如果允许出现负数,那么琐碎的解决方案是不正确的:
那怎么办
然而,建议的解决方案产生了
我刚刚在Scala课程中遇到了这个问题:—)我仍然没有一个好的解决方案。 也许,就像经常查看BOOST库一样,它会说:
http://www.boost.org/doc/libs/1_55_0/libs/rational/rational.html 到目前为止,我还没有机会调查那段代码。 干杯, 费利克斯 与此同时,我查看了Boost代码,它的功能与Liberius在上面的回答中描述的一样。 https://stackoverflow.com/a/4288890/2682209 所以这绝对是“正确的”(但很麻烦)的方法。 |
5
1
我不喜欢
|
6
0
如果您使用Java,那么可以使用
|
danial · 如何在多个字符串的每个位置找到最频繁的字符 2 年前 |
Manny · 如何比较Perl中的字符串? 2 年前 |
Diret · 获取范围内每个数字的子倍数的算法 2 年前 |
Saif · 排序时python如何决定何时调用比较器? 2 年前 |