求两个超大整数的商并向上取整,哪个代码效率高?
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 );
或者,有更好的代码??? 应该是1
但如果可能
还是单独做一个算法效率高些
:lol 最好最快的代码就是代码1。:b:
代码2和代码3都需要额外的加减法运算,以及潜在的对象拷贝操作。
但是代码1会改变变量a,如果要消除该问题,可用如下代码:CHugeIntX r;
q.Div(CHugeIntX(a), b, &r);
if ( !(!r) ) ++q;注意:判断 r 非零的代码为“!(!r)”,要多一个“!”,
两个“!”不可同时抵消,因为里面那个是重载的自定义运算符。 不明白 “但是代码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 的 对不起,我在 3# 说错了,被除数是 CONST 的,返回的是商。
(自己很疲劳,儿子又生病了,所以脑子有点乱:( )
所以最简洁最高效的代码是:CHugeIntX r;
q.Div(a, b, &r);
if ( !(!r) ) ++q;
页:
[1]