我知道这个问题可能已经在这个论坛和网络上被问过很多次了。我被要求在 C++ 中创建一个大整数的实现,但是有一个约束是我的构造函数之一应该将一个 int 作为参数......所以我猜会有多个非默认构造函数...... .所以我的问题是,最简单的方法是什么?
问问题
1679 次
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
上课时,请执行以下操作:
- 清除所有位
- 编写一个遍历
int
构造函数参数的所有位的循环 - 对于
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 回答