不使用bigint怎么比较这么大的产品

问题描述 投票:0回答:1
long long a,b,c,d,e,f,g,h;
bool is_greater = a*b*c*d > e*f*g*h;

我尝试将类型转换为

long double
然后使用除法(即 lhs 上的一个变量被 rhs 上的另一个变量)但是由于精度错误我得到了不正确的输出。 请注意,我什至不允许使用
__int128

我的另一个想法是先尝试高位数字然后是低位数字,就像这样

int M=1e9;
p1 = a/M;
q1 = b/M;
r1 = c/M;
s1 = d/M;

u1 = e/M;
t1 = f/M;
v1 = g/M;
w1 = h/M;

if (p1*q1*r1*s1 > u1*t1*v1*w1) return true;
if (p1*q1*r1*s1 < u1*t1*v1*w1) return false;
//if equal try lower digits:
p2 = a%M;
q2 = b%M;
r2 = c%M;
s2 = d%M;

u2 = e%M;
t2 = f%M;
v2 = g%M;
w2 = h%M;
return (p2*q2*r2*s1 > u2*t2*v2*w1);

正如@n-m 所称,这只不过是 bigint ,但我试图逆向 enginner 的原因是因为我有另一条信息。最终的解决方案是 256 位,但我得到的信息是,99.99% 的时间差异将出现在最后 128 位中,最有可能出现在最后 64 位中。我想使用这些信息来使我的代码更快(在分摊的基础上)并且不会遭受精度错误的影响。所以我在任何一方都在权衡取舍。

c++ biginteger
1个回答
1
投票

如果

a * b * c * > e * f * g * h [1]

a/e * b/f * c/g * d/h > 1 [2]

假设一切都是积极的。如果 e、f、g、h 中的某些为负数:

  • 如果他们中的奇数是负翻转>到<,
  • 偶数个为负数,不改号

结论是:如果 [2] 为真那么 [1] 也为真(再次注意符号)

伪代码:

int p = 0;
for (x in [efgh])
    if (x < 0)
        p += 1;

if (pow(-1, p) < 0)
    flip_the_sign;
© www.soinside.com 2019 - 2024. All rights reserved.