带符号大整数加减法,乘法,除法,模除,指数

本文探讨了如何实现带符号的大整数运算,包括加减法、乘法、除法和模除。首先通过无符号整数运算作为基础,使用std::vector<char>存储大整数,然后实现有符号运算,考虑符号位的影响。乘法和除法利用无符号乘法和加法运算完成。此外,还讨论了测试和扩展,如整数与大整数之间的转换,以增强运算的灵活性。
摘要由CSDN通过智能技术生成

一、问题的思考

1、对于大整数,我们只需要提供构造,显示,加减法,乘法,除法,模除,指数这些用户接口就可以了。

2、符号位怎么解决?首先考虑的办法是定义一个类,然后里面有sign_, std::vector<char> i_这两个成员变量,我在实现的过程中发现这样写代码,思路不够清晰,代码也不好写。因为当我们编写代码实现加减乘除,比较运算的时候,就不得不考虑符号位,这种设计会使代码的逻辑复杂,不够清晰。

3、正确的办法是先编写一个UnsignedInteger类实现所有的运算,然后再实现有符号的大整数运算。

4、如何实现无符号大整数加减乘除(减法只支持大减小)。加减都很简单,乘法只需提供基本UnsignedInteger * (0--9),UnsignedInteger * (10 ^K),然后利用加法运算,就可以实现乘法。除法则需要利用UnsignedInteger * (0--9),UnsignedInteger * (10 ^K)比较运算,减法运算,就可以实现除法。

5、无符号大整数的存储采用std::vector<char>,每一个char表示一个十进制位,并且第一个char表示最低位,最后一个char表示最高位

1、无符号整数的基础运算

代码如下:

#include <iostream>
#include <vector>
#include <assert.h>
#include <cmath>
#include <utility>

class UnsignBigInteger {
	private:
		std::vector< char > i_; 
		void compact() {
			int count = 0;
			for( int i = i_.size() - 1; i >= 0; i-- )
				if( i_[i] == 0 ) 
					count++;
				else
					break;
			//resize dose not change storage capacity directly
			i_.resize( i_.size() - count );
		}   
		void expand10( int k ) { 
			int curSize = i_.size();
			int expandSize = curSize + k;
			i_.resize( expandSize, 0 );
			copy_backward( i_.begin(), i_.begin() + curSize, 
					i_.end() );
			fill_n( i_.begin(), k, 0 );
		}   
		void add( const UnsignBigInteger &other ) { 
			int max = std::max( i_.size(), other.i_.size() );
			//to reserve one more place, so it is enough to hold sum    
			i_.resize( max + 1, 0 );  
			int c = 0;

			for( unsigned i = 0; i < i_.size(); i++ ) { 
				int value = i_[i] + c ; 
				if( i < other.i_.size() )
					value += other.i_[i];
				i_[i] = value % 10; 
				c = value / 10; 
			}   
		}  
		void sub( const UnsignBigInteger &o ) { 
			i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值