c ++中的大整数

时间:2009-11-29 15:27:30

标签: c++ c algorithm biginteger

我知道这个问题可能已在本论坛多次和网络上提出过。我被要求在c ++中创建一个大整数的实现,但是有一个约束,我的一个构造函数应该将一个int作为参数...所以我猜测将有多个非默认构造函数..所以我的问题是,最简单的方法是什么?

3 个答案:

答案 0 :(得分:1)

然后,问题似乎是“如何将整数转换为位列表”?换句话说,整数的base-2表示是什么?

因为这应该是家庭作业,让我通过思考基础10来讨论这个问题;一些想法应该是明显的适当变化。

给定一个基数为10的数字,很容易弄清楚最右边的数字是什么:它只是除以10时的余数。如果n = 1234,那么它最右边的数字是n%10 = 4.为了获得下一个最右边的数字,我们除以10(得到123),并重复该过程。所以:

1234/10=123; 1234%10 = 4
123/10=12  ; 123%10 = 3
12/10=1    ; 12%10 = 2
1/10=0     ; 1%10 = 1

所以现在我们得到了答案[4,3,2,1]。如果我们反转它们,我们的数字的基数为10:[1,2,3,4]。

答案 1 :(得分:0)

为什么重新发明轮子?使用GNU MP library

[编辑]闻起来像家庭作业。所以当你有BigBit课程时,请执行以下操作:

  1. 清除所有位
  2. 编写一个循环,遍历构造函数的int参数上的所有位
  3. 对于int参数中!= 0的每个位,请设置BigBit向量中的位。

答案 2 :(得分:0)

C++ BigInt class
C++ Big Integer Library
写一个大的int例如:

typedef struct {
    int high, low;
} BiggerInt;

BiggerInt add( const BiggerInt *lhs, const BiggerInt *rhs ) {
    BiggerInt ret;

    /* Ideally, you'd want a better way to check for overflow conditions */
    if ( rhs->high < INT_MAX - lhs->high ) {
        /* With a variable-length (a real) BigInt, you'd allocate some more room here */
    }

    ret.high = lhs->high + rhs->high;

    if ( rhs->low < INT_MAX - lhs->low ) {
        /* No overflow */
        ret.low = lhs->low + rhs->low;
    }
    else {
        /* Overflow */
        ret.high += 1;
        ret.low = lhs->low - ( INT_MAX - rhs->low ); /* Right? */
    }

    return ret;
}