C++之大数相减

1.问题描述

两个大数相减。输入是两个字符串,如“123”,“234”。实现两个数的相减。返回结果也是一个字符串。因为是C++所以使用string。
输入:

12
99

输出:

-87

2.源代码(分析在代码中)

#include <iostream>
#include <sstream>
using namespace std;
string Subtraction(string num1,string num2)
{
    //fushu用来判断最后结果是否是负数
    bool fushu = false;
    //如果被减数位数小于减数,那么结果是负数,同时两个字符串交换顺序,大的数减小的数
    if(num1.size()<num2.size())
    {
        string temp = num1;
        num1 = num2;
        num2 = temp;
        fushu = true;
    }
    //两个数长度一样,这个时候,需要判断哪个数更大,如果被减数小于减数,那么结果是负数,同时两个字符串交换顺序,大的数减小的数
    else if(num1.size() == num2.size())
    {
        int len = num1.size();
        for(int i=0;i<len;++i)
        {
            if(num1[i] == num2[i])
                continue;
            if(num1[i]>num2[i])
                break;
            if(num1[i]<num2[i])
            {
                string temp = num1;
                num1 = num2;
                num2 = temp;
                fushu = true;
            }
        }
    }
    int lenNum1 = num1.size();
    int lenNum2 = num2.size();

    //用来保存结果
    int* result = new int[lenNum1];
    int index = 0;
    //num1 31 num2 29 result 1,3
    //把被除数的结果先放到result中
    for(int i=lenNum1-1;i >=0;--i)
        result[index++]=num1[i]-'0';

    //进行减法操作
    index = 0;
    for(int i=lenNum2-1;i>=0;--i)
    {
        int num = num2[i]-'0';
        //如果减数 大于 被减数,则需要退位
        if(num>result[index])
        {
            result[index+1] -=1;
            result[index] = 10+result[index] - num;
        }
        //直接相减
        else
            result[index] = result[index] - num;

        ++index;
    }
    //清除result尾部的0,index从右到左遍历,直到第一个不是0为止
    index = lenNum1-1;
    while(result[index] == 0)
        --index;


    //使用stringstream流,方便把数组输出到字符串中
    ostringstream osstr;
    //判断是否结果是负数
    if(fushu == true)
        osstr<<'-';
    for(int i=index;i>=0;--i)
        osstr<<result[i];
    delete result;
    return osstr.str();
}
int main()
{

    string num1,num2;
    cin>>num1>>num2;
    cout<<Subtraction(num1,num2)<<endl;
    return 0;
}

3.测试

输入:

29
101

输出:

-72

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是一个基本的 C++ 大数类实现,包括加和减的功能。该实现使用了字符串来存储大数,通过重载运算符来实现加减运算。 ``` #include <iostream> #include <string> #include <algorithm> using namespace std; class BigInteger { private: string num; bool sign; public: BigInteger() : num(""), sign(false) {} BigInteger(string s) { if (isdigit(s[0])) { setNumber(s); sign = false; } else { setNumber(s.substr(1)); sign = (s[0] == '-'); } } void setNumber(string s) { num = s; reverse(num.begin(), num.end()); } string toString() const { string res = num; reverse(res.begin(), res.end()); if (sign) res = '-' + res; return res; } BigInteger operator + (const BigInteger& b) const { if (sign != b.sign) return *this - (-b); BigInteger res; res.sign = sign; int carry = 0; for (int i = 0; i < (int)max(num.length(), b.num.length()) || carry; i++) { int x = carry; if (i < (int)num.length()) x += num[i] - '0'; if (i < (int)b.num.length()) x += b.num[i] - '0'; res.num += (x % 10) + '0'; carry = x / 10; } return res; } BigInteger operator - (const BigInteger& b) const { if (sign != b.sign) return *this + (-b); if (abs(*this) < abs(b)) return -(b - *this); BigInteger res; res.sign = (sign == false && b.sign == true); int borrow = 0; for (int i = 0; i < (int)num.length(); i++) { int x = num[i] - '0' - borrow; if (i < (int)b.num.length()) x -= b.num[i] - '0'; borrow = 0; if (x < 0) { x += 10; borrow = 1; } res.num += x + '0'; } res.removeLeadingZeros(); return res; } BigInteger operator - () const { BigInteger res = *this; res.sign = !sign; return res; } bool operator < (const BigInteger& b) const { if (sign != b.sign) return sign; if (num.length() != b.num.length()) return num.length() < b.num.length(); for (int i = (int)num.length() - 1; i >= 0; i--) if (num[i] != b.num[i]) return sign ? num[i] > b.num[i] : num[i] < b.num[i]; return false; } bool operator > (const BigInteger& b) const { return b < *this; } bool operator <= (const BigInteger& b) const { return !(b < *this); } bool operator >= (const BigInteger& b) const { return !(*this < b); } bool operator == (const BigInteger& b) const { return !(*this < b) && !(b < *this); } bool operator != (const BigInteger& b) const { return *this < b || b < *this; } void removeLeadingZeros() { while (num.length() > 1 && num.back() == '0') num.pop_back(); if (num.length() == 1 && num[0] == '0') sign = false; } BigInteger abs() const { BigInteger res = *this; res.sign = false; return res; } }; int main() { BigInteger a("123456789012345678901234567890"); BigInteger b("-987654321098765432109876543210"); cout << a + b << endl; cout << a - b << endl; return 0; } ``` 在上面的代码中,我们将大数类定义为一个 `BigInteger` 类,它包含一个字符串类型的 `num` 成员变量和一个布尔类型的 `sign` 成员变量,分别表示大数的绝对值和符号。实现了构造函数、设置数值、转换为字符串、加、减、取反、比较、移除前导零等操作。其中加、减操作使用了类似小学竖式计算的方法,从个位到高位逐位相加或相减,并处理进位、借位等情况。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值