在c语言中大的正整数怎么表示,如何在C+中实现大整数

一个有趣的挑战。*)

我假设你想要任意长度的整数。我建议采取以下办法:

考虑数据类型“int”的二进制性质。考虑使用简单的二进制操作来模拟CPU中的电路在添加内容时所做的事情。如果你对此更感兴趣,可以考虑阅读。这篇维基百科的文章是关于加法器和加法器的。..你会做一些类似的事情,但你可以降低到这样低的水平-但由于懒惰,我想我会放弃,找到一个更简单的解决方案。

但是在讨论任何关于加、减、乘的算法细节之前,让我们先找出一些数据结构。当然,一个简单的方法是将事物存储在std:Vector中。templateclass BigInt{typedef typename BaseType BT;protected: std::vector value_;};

您可能需要考虑是否要生成固定大小的向量,以及是否预先分配它。原因是对于不同的操作,您必须遍历向量的每个元素-O(N)。您可能想知道一个操作有多复杂,而固定的n就是这样做的。

但是现在我们来谈谈一些关于对数字运算的算法。您可以在逻辑级别上这样做,但是我们将使用这种神奇的CPU能力来计算结果。但是,我们将从逻辑图中接过一半和FullAdders的例子,那就是它处理载体的方式。例如,考虑如何实现+=运算符..对于BigInt<>:value_中的每个数字,您将添加这些数字,并查看结果是否产生某种形式的进位。我们不会做一点点的,而是依赖于我们的BaseType的性质(不管是长的、int的还是短的或者其他什么的):它溢出了。

当然,如果你加上两个数字,结果肯定要大于其中的一个,对吧?如果不是,结果就会溢出来。templateBigInt& BigInt::operator += (BigInt const& operand){

BT count, carry = 0;

for (count = 0; count 

{

BT op0 = count 

op1 = count 

BT digits_result = op0 + op1 + carry;

if (digits_result-carry 

{

BT carry_old = carry;

carry = digits_result;

digits_result = (op0 + op1 + carry) >> sizeof(BT)*8; // NOTE [1]

}

else carry = 0;

}

return *this;}// NOTE 1: I did not test this code. And I am not sure if this will work; if it does

//         not, then you must restrict BaseType to be the second biggest type

//         available, i.e. a 32-bit int when you have a 64-bit long. Then use

//         a temporary or a cast to the mightier type and retrieve the upper bits.

//         Or you do it bitwise. ;-)

另一个算术运算类似。见鬼,你甚至可以使用stl-函子std:plus和std:减号,std:time和std:除法,.但是要注意进位。)还可以使用加号和减号运算符实现乘法和除法,但这非常慢,因为这将重新计算在每次迭代中对加号和减号的调用中已经计算过的结果。对于这个简单的任务,有很多很好的算法,使用维基百科或者网络。

当然,您应该实现标准运算符,例如operator<

希望这个方法有帮助!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值