sunwukong 发表于 2008-9-8 20:19:07

求两个超大整数的商并向上取整,哪个代码效率高?

a、b 是两个超大整数,a>=0,b>0,计算 q = |~a/b~|,下面的代码哪个效率高?

代码1:CHugeIntX r;

q.Div(a, b, &r);
if ( !r ) ++q;
代码2;q = ( a + b - 1) / b;代码3(代码2的变体):CHugeIntX t(a+b);
--t;
q.Div( t, b );
或者,有更好的代码???

无心人 发表于 2008-9-8 21:23:18

应该是1
但如果可能
还是单独做一个算法效率高些

:lol

gxqcn 发表于 2008-9-8 21:25:45

最好最快的代码就是代码1。:b:

代码2和代码3都需要额外的加减法运算,以及潜在的对象拷贝操作。

但是代码1会改变变量a,如果要消除该问题,可用如下代码:CHugeIntX r;

q.Div(CHugeIntX(a), b, &r);
if ( !(!r) ) ++q;注意:判断 r 非零的代码为“!(!r)”,要多一个“!”,
两个“!”不可同时抵消,因为里面那个是重载的自定义运算符。

sunwukong 发表于 2008-9-8 22:59:29

不明白 “但是代码1会改变变量a”,以下测试代码:        CHugeIntX a(999), b(10), aa, q, r;
       
        aa = a;

        q.Div( a, b, &r );
        if ( !(!r) ) ++q;       
       
        cout << "q = " << int(q) << ",r = " << int(r) << endl << endl;
       
        if ( a == aa)
                cout << "a == aa";
        else
                cout << "a<>aa";
       
        cout << endl << endl;
的运行结果是:q = 100,r = 9

a == aa

Press any key to continue还有,Div 的声明CHugeIntX& CHugeIntX::Div( CONST CHugeIntX& hugeDividend, CONST CHugeIntX& hugeDivisor, CHugeIntX& CONST pRemainder = NULL );
也说被除数 hugeDividend 是 CONST 的

gxqcn 发表于 2008-9-9 07:49:43

对不起,我在 3# 说错了,被除数是 CONST 的,返回的是商。
(自己很疲劳,儿子又生病了,所以脑子有点乱:( )

所以最简洁最高效的代码是:CHugeIntX r;

q.Div(a, b, &r);
if ( !(!r) ) ++q;
页: [1]
查看完整版本: 求两个超大整数的商并向上取整,哪个代码效率高?