1

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

4

3 回答 3

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]。

于 2009-11-29T16:21:15.540 回答
0

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

[编辑] 闻起来像家庭作业。因此,当您BigBit上课时,请执行以下操作:

  1. 清除所有位
  2. 编写一个遍历int构造函数参数的所有位的循环
  3. 对于int参数 中的每个位!= 0,设置BigBit向量中的位。
于 2009-11-29T15:36:54.817 回答
0

C++ BigInt 类
C++ Big Integer Library
来写 big 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;
}
于 2009-11-29T15:43:57.433 回答