大整数加减法(C++实现)

 头文件:LargeInteger.h

#ifndef LARGEINTEGER_H_INCLUDED
#define LARGEINTEGER_H_INCLUDED

#include <iostream>

using namespace std;

class LargeInteger {// 大整数(用字符串表示)
public:
    LargeInteger() { this->numStr = "0"; }// 默认为 0
    LargeInteger(const string& numStr);// 用字符串初始化
    LargeInteger(const int& num);// 用 int 型数据初始化
    string getNum() const { return numStr; }
    void setNum(const string& numStr);
    void setNum(const int& num);
    void trimNum();// 去掉数字前面所有的 0
    friend bool isNum(const string& numStr);
    friend istream& operator>>(istream& in, LargeInteger& largeInteger);
    friend ostream& operator<<(ostream& out, const LargeInteger& largeInteger);
    friend const LargeInteger operator+(const LargeInteger& A, const LargeInteger& B);
    friend const LargeInteger operator-(const LargeInteger& A, const LargeInteger& B);
private:
    string numStr;
};

#endif // LARGEINTEGER_H_INCLUDED


源文件:LargeInteger.cpp

#include "LargeInteger.h"
#include <sstream>

bool isNum(const string& numStr) { // 判断一个 string 型的 numStr 里面存放的是不是表示的一个整数
    if(numStr.empty()) return false;
    if('-' == numStr[0] || '+' == numStr[0]) {
        if(1 == numStr.size()) return false;
    }
    for(string::size_type i=1; i < numStr.size(); i++) {
        if(numStr[i] < '0' || numStr[i] > '9')
            return false;
    }
    return true;
}

void LargeInteger::trimNum() {// 去掉数字前面所有的 0 字符
    string sign = "";
    string::size_type beginIndex = 0;
    if('-' == this->numStr[0]) {
        sign = "-";
        beginIndex++;
    }
    for(; beginIndex < this->numStr.size(); beginIndex++) {
        if('0' != this->numStr[beginIndex])
            break;
    }
    if(numStr.size() == beginIndex)
        this->numStr = "0";
    else
        this->numStr = sign + this->numStr.substr(beginIndex);
}

LargeInteger::LargeInteger(const string& numStr) {
    this->setNum(numStr);
}

LargeInteger::LargeInteger(const int& num) {
    this->setNum(num);
}

void LargeInteger::setNum(const string& numStr) {
    if(isNum(numStr)) {
        if('+' == numStr[0])
            this->numStr = numStr.substr(1);
        else
            this->numStr = numStr;
    } else
        this->numStr = "0";
    this->trimNum();
}

void LargeInteger::setNum(const int& num) {
    stringstream ss;
    ss << num;
    this->numStr = ss.str();
}

istream& operator>>(istream& in, LargeInteger& largeInteger) {
    in >> largeInteger.numStr;
    if(isNum(largeInteger.numStr)) {
        if('+' == largeInteger.numStr[0])
            largeInteger.numStr = largeInteger.numStr.substr(1);
    } else
        largeInteger.numStr = "0";
    largeInteger.trimNum();
    return in;
}

ostream& operator<<(ostream& out, const LargeInteger& largeInteger) {
    out << largeInteger.numStr;
    return out;
}

void Add(string& sumStr, string aStr, int lengthA, string bStr, int lengthB) {// 两正整数相加
    int n = lengthA;
    if(lengthA < lengthB) {
        n = lengthB;
        aStr = string(n - lengthA, '0') + aStr;
    } else {
        bStr = string(n - lengthB, '0') + bStr;
    }
    int carry = 0;
    while(--n >= 0) {
        int a = aStr[n] - '0';
        int b = bStr[n] - '0';
        int sum = a + b + carry;
        carry = sum / 10;
        sum %= 10;
        char c = sum + '0';
        sumStr = c + sumStr;
    }
    if(carry > 0) {
        char c = carry + '0';
        sumStr = c + sumStr;
    }
}

LargeInteger const operator+(const LargeInteger& A, const LargeInteger& B) {
    string sumStr = "";
    int lengthA = A.numStr.size();
    int lengthB = B.numStr.size();
    if('0' <= A.numStr[0] && A.numStr[0] <= '9' && '0' <= B.numStr[0] && B.numStr[0] <= '9') {// 两正整数相加
        Add(sumStr, A.numStr, lengthA, B.numStr, lengthB);
    } else if('-' == A.numStr[0] && '-' == B.numStr[0]) {// 两负整数相加
        Add(sumStr, A.numStr.substr(1), --lengthA, B.numStr.substr(1), --lengthB);
        sumStr = "-" + sumStr;
    } else if('-' == A.numStr[0]) {
        string temp = A.numStr.substr(1);
        return (B - temp);
    } else {
        string temp = B.numStr.substr(1);
        return (A - temp);
    }
    return sumStr;
}

void Minus(string& minusStr, string aStr, int lengthA, string bStr, int lengthB) {// 两正整数相减
    bool flag = true;// 默认符号位为正
    if(lengthA < lengthB || (lengthA == lengthB && aStr[0] < bStr[0])) {// 如果 A <= B,则计算 B-A,并设置符号位为负
        string tempStr = aStr;
        aStr = bStr;
        bStr = tempStr;
        lengthA = aStr.size();
        lengthB = bStr.size();
        flag = false;
    }
    int n = lengthA;
    bStr = string(n - lengthB, '0') + bStr;
    int borrow = 0, index = n;
    while(--n >= 0) {
        int a = aStr[n] - '0';
        if(a > 0) {
            a -= borrow;
            borrow = 0;
        } else {
            if(borrow > 0)
                a = 9;
        }
        int b = bStr[n] - '0';
        char c;
        if(0 == b) {
            c = a + '0';
        } else {
            if(a >= b) {
                c = a - b + '0';
            } else {
                a += 10;
                c = a - b + '0';
                borrow++;
            }
        }
        minusStr = c + minusStr;
        if(minusStr[0] != '0')
            index = n;
    }
    if(index == n)
        minusStr = "0";
    else {
        minusStr = minusStr.substr(index);
        if(!flag) {
            minusStr = "-" + minusStr;
        }
    }
}

LargeInteger const operator-(const LargeInteger& A, const LargeInteger& B) {
    string minusStr = "";
    int lengthA = A.numStr.size();
    int lengthB = B.numStr.size();
    if('0' < A.numStr[0] && A.numStr[0] <= '9' && '0' < B.numStr[0] && B.numStr[0] <= '9') {// 两正整数相减
        Minus(minusStr, A.numStr, lengthA, B.numStr, lengthB);
        return minusStr;
    } else if('-' == A.numStr[0] && '-' == B.numStr[0]) { // 两负整数相减
        Minus(minusStr, A.numStr.substr(1), lengthA-1, B.numStr.substr(1), lengthB-1);
        if('-' == minusStr[0])
            minusStr = minusStr.substr(1);
        else
            minusStr = "-" + minusStr;
        return minusStr;
    } else {
        if('-' == B.numStr[0]) {// 正整数减负整数(即,两正整数相加)
            Add(minusStr, A.numStr, lengthA, B.numStr.substr(1), lengthB-1);
            return minusStr;
        } else { // 负整数减正整数(即,负的 两正整数相加)
            Add(minusStr, A.numStr.substr(1), lengthA-1, B.numStr, lengthB);
            minusStr = "-" + minusStr;
            return minusStr;
        }
    }
}

主函数测试:

#include "LargeInteger.h"

int main() {
    LargeInteger A, B;
    LargeInteger C(145265555), D(145325563);
    LargeInteger E("12345678912345678145912345678987654321"), F("15483395674458414455268441265444556845555445677");

    cin >> A >> B;
    cout << A << " + " << B << " = " << A + B << endl;
    cout << A << " - " << B << " = " << A - B << endl;

    cout << C << " + " << D << " = " << C + D << endl;
    cout << C << " - " << D << " = " << C - D << endl;

    cout << E << " + " << F << " = " << E + F << endl;
    cout << E << " - " << F << " = " << E - F << endl;
    return 0;
}


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 首先,我们需要定义一个双向链表结构体,包含三个成员变量:前驱节点指针、后继节点指针和当前节点的值。代码如下: ```c++ struct Node { Node *prev, *next; int val; }; ``` 接下来,我们可以定义一个类来实现超长整数的加减法。在这个类中,我们需要定义两个双向链表,分别存储两个超长整数的每一位。加法操作需要从链表的尾部开始遍历,同时在遍历的过程中需要考虑进位。减法操作需要先比较两个超长整数的大小,然后从链表的尾部开始遍历,同时在遍历的过程中需要考虑借位。 下面是一个示例代码,可以实现超长整数的加减法: ```c++ class LongInt { public: LongInt() { head1 = new Node; head2 = new Node; tail1 = head1; tail2 = head2; head1->prev = NULL; head2->prev = NULL; head1->next = tail1; head2->next = tail2; tail1->prev = head1; tail2->prev = head2; tail1->next = NULL; tail2->next = NULL; } void add(int x) { Node *node = new Node; node->val = x; node->prev = tail1; node->next = tail1->next; tail1->next = node; tail1 = node; } void sub(int x) { Node *node = new Node; node->val = x; node->prev = tail2; node->next = tail2->next; tail2->next = node; tail2 = node; } LongInt operator+(const LongInt& other) const { LongInt res; Node *p = tail1->prev; Node *q = other.tail1->prev; int carry = 0; while (p != head1->prev || q != other.head1->prev || carry != 0) { int x = (p != head1->prev ? p->val : 0); int y = (q != other.head1->prev ? q->val : 0); int sum = x + y + carry; carry = sum / 10; sum %= 10; res.add(sum); if (p != head1->prev) p = p->prev; if (q != other.head1->prev) q = q->prev; } return res; } LongInt operator-(const LongInt& other) const { LongInt res; Node *p = tail1->prev; Node *q = other.tail1->prev; bool borrow = false; if (compare(other) < 0) { borrow = true; std::swap(p, q); } while (p != head1->prev || q != other.head1->prev) { int x = (p != head1->prev ? p->val : 0); int y = (q != other.head1->prev ? q->val : 0); if (borrow) x--; if (x < y) { x += 10; borrow = true; } else { borrow = false; } int diff = x - y; res.sub(diff); if (p != head1->prev) p = p->prev; if (q != other.head1->prev) q = q->prev; } return res; } int compare(const LongInt& other) const { Node *p = tail1->prev; Node *q = other.tail1->prev; while (p != head1->prev || q != other.head1->prev) { int x = (p != head1->prev ? p->val : 0); int y = (q != other.head1->prev ? q->val : 0); if (x > y) { return 1; } else if (x < y) { return -1; } if (p != head1->prev) p = p->prev; if (q != other.head1->prev) q = q->prev; } return 0; } private: Node *head1, *head2, *tail1, *tail2; }; ``` 使用示例: ```c++ LongInt a, b; a.add(9); a.add(9); a.add(9); b.add(1); b.add(0); LongInt c = a + b; LongInt d = a - b; ``` 在这个示例中,我们创建了两个超长整数 a 和 b,然后分别添加了三个数字和两个数字。接着,我们通过重载运算符实现了加法和减法操作,并将结果存储在变量 c 和 d 中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值