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

猜你喜欢

转载自blog.csdn.net/zqw_yaomin/article/details/82462719
今日推荐