相关文章推荐
帅气的夕阳  ·  regeneratorRuntime.js: ...·  6 月前    · 
狂野的火车  ·  2021-12-03记录:Javascrip ...·  8 月前    · 
威武的企鹅  ·  java jsonnode 遍历_51CTO博客·  1 年前    · 
c++编一个关于大整型无符号数加法、乘法的类

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");