c++编一个关于大整型无符号数加法、乘法的类
整型数一般是4个字节,但是有时经常会遇到超大数的运算,那么系统提供的 int, long就不够用了。因此必须自定义大整型类,设为MyBigNum,代码如下所示。
#include <iostream>
#include <string>
#include <deque>
#include <functional>
#include <algorithm>
#include <iterator>
using namespace std;
class MyBigNum{
deque<int> v;
public:
MyBigNum(){}
MyBigNum(string strNum){ //通过字符串建立大整数
copy(strNum.begin(), strNum.end(), back_inserter(v));
transform(v.begin(), v.end(), v.begin(), bind2nd(minus<int>(), '0')); //整型字符转int只需减去'0'即可'
deque<int>::iterator begin(){ //做deque容器的封装
return v.begin();
deque<int>::iterator end(){
return v.end();
int size(){
return v.size();
back_insert_iterator<deque<int>> Back_Inserter(){
return back_inserter(v);
void push_front(int n){
v.push_front(n);
void push_back(int n){
v.push_back(n);
void adjust(){ //调整结果,使容器每位整型元素值都小于10
int nSize = v.size();
for(int i = nSize - 1; i >= 1; i--){
int value = v[i];
if(value < 10)
continue;
v[i] = value % 10; //各位
v[i - 1] += value / 10; //多出10则进位
int value = v[0]; //处理最高位
if(value >= 10){
v[0] = value % 10;
value = value / 10;
while(value > 0){
v.push_front(value % 10); //前插进位
value /= 10;
MyBigNum Add(MyBigNum& m){
MyBigNum result;
int n = size() - m.size();
if(n >= 0){ //保持同位相加
transform(begin() + n, end(), m.begin(), result.Back_Inserter(), plus<int>());
for(int i = n - 1; i >= 0; i--){
result.push_front(*(begin() + i)); //将多余位前插
}else{ //n < 0
transform(begin(), end(), m.begin() - n, result.Back_Inserter(), plus<int>());
for(int i = n - 1; i >= 0; i--){
result.push_front(*(m.begin() + i));
result.adjust(); //结果调整
return result;
MyBigNum Multiply(MyBigNum& m){
MyBigNum result("0");
MyBigNum mid;
for(int i = 0; i < m.size(); i++){
mid = *this; //每次都更新状态
for(int j = 0; j < i; j++){
mid.push_back(0); //加0相当于扩大10倍,即乘以被乘数的位数
} //被乘数分别乘以每位乘数,所以需要更新乘数
transform(mid.begin(), mid.end(), mid.begin(), bind2nd(multiplies<int>(), *(m.begin() + i)));
result = mid.Add(result); //分项之和累加
return result;
int main(){
MyBigNum m1("1234567890");
MyBigNum m2("9999999998");
MyBigNum result = m1.Add(m2);
cout<< "1234567890 + 9999999998 = ";
copy(result.begin(), result.end(), ostream_iterator<int>(cout));
cout<< endl;
MyBigNum m3("99");