【问题标题】:big integers in c++C++中的大整数
【发布时间】:2009-11-29 15:27:29
【问题描述】:

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

【问题讨论】:

  • 以及c++是一个oo,作业要求之一是我自己实现它,我应该这样组织它:BigInteger基本上是BigBit指针的向量。 BigBit 必须重载位的标准逻辑运算符,例如 &、|、~ 和 ^。所以我将 BigBit 实现为 bool.... 现在的问题是如何在 BigInteger 类中存储大量数字。如果我有这样的限制,它是如何工作的?是的,这是家庭作业,我只是想找到关于如何以最简单的方式做到这一点的想法或见解......

标签: c++ c algorithm biginteger


【解决方案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]。

【讨论】:

  • 这在整数很小的情况下有效...如果整数很大,例如 2^10... 肯定我需要先将它存储在一个变量中,然后再将其转换为位...现在的问题是什么样的变量能够存储它......一个字符串可以做到这一点,但是我如何将一个字符串转换为二进制......
  • 2^10 并没有那么大。我暗示的算法只需要一个除法和一个模数。如果您开始的数字适合机器字(例如 unsigned int),它会正常工作。如果没有,我们要再次转换什么?
【解决方案2】:

C++ BigInt class
C++ Big Integer Library
例如写大整数:

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;
}

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 以及c++是一个oo,其中一个要求是我自己实现它,我应该这样组织它:BigInteger基本上是BigBit指针的向量。 BigBit 必须重载位的标准逻辑运算符,例如 &、|、~ 和 ^。所以我将 BigBit 实现为 bool.... 现在的问题是如何在 BigInteger 类中存储大量数字。如果我有这样的限制,它是如何工作的
    • 这也是如果参数是一个int,我们在这里谈论的是大数..所以一个int不会持有它......如果参数是一个字符串,你会怎么做将字符串转换为位......代表那个大数字
    • 查看atoi()的源代码如何将字符串转换为其二进制表示。这很简单。有关示例,请参见 koders.com:koders.com/c/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2015-08-08
    • 1970-01-01
    • 2011-06-17
    • 2015-04-25
    相关资源
    最近更新 更多