大整数相加和相乘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38169413/article/details/82698617

大整数相加

/*******************************************************************************
功    能:超长整数相加
创建时间: 2018-08-05
作    者:Elvan
修改时间:
作    者:
********************************************************************************/
#include <iostream>
using namespace std;

/************************************************************
 * 函 数 名:string Add(string a, string b)
 * 函数功能:计算两个整数的和
 * 函数参数:a,b-字符串(可能有负数的情况)
 * 返 回 值:和
 * 作    者:Elvan
 * 创建日期:2018-08-03
 * **********************************************************/
string Add(string a, string b)
{
    //都是正数
    if(a[0] != '-' && b[0] != '-')
    {
        while (a.size() < b.size())
            a = "0" + a;
        while (a.size() > b.size())
            b = "0" + b;

        int temp = 0, flag = 0;
        for (int i = a.size() - 1; i >= 0; i--)
        {
            temp = a[i] - '0' + b[i] - '0' + flag;
            a[i] = temp % 10 + '0';
            if (temp >= 10)
                flag = 1;
            else
                flag = 0;
        }
        if (flag == 1)
            a = "1" + a;
    }
    //都是负数
    else if(a[0] == '-' && b[0] == '-')
    {
        a = a.substr(1);
        b = b.substr(1);
        while (a.size() < b.size())
            a = "0" + a;
        while (a.size() > b.size())
            b = "0" + b;

        int temp = 0, flag = 0;
        for (int i = a.size() - 1; i >= 0; i--)
        {
            temp = a[i] - '0' + b[i] - '0' + flag;
            a[i] = temp % 10 + '0';
            if (temp >= 10)
                flag = 1;
            else
                flag = 0;
        }
        if (flag == 1)
            a = "1" + a;
        a = "-" + a;
    }
    //有一个是负数
    else
    {
        //a是负数,b是正数
        if(a[0] == '-')
            a = a.substr(1);
        if(b[0] == '-')
        {
            string tmp = b.substr(1);
            a = b;
            b = a;
        }
        //取绝对值大的哪一个
        bool k;
        if(a.size() <= b.size())
        {
            k = false;
        }
        else
            k = true;

        while (a.size() < b.size())
            a = "0" + a;
        while (a.size() > b.size())
            b = "0" + b;

        if(k)
        {
            string tmp = a;
            a = b;
            b = tmp;
        }
        int temp = 0, flag = 0;
        for (int i = a.size() - 1; i >= 0; i--)
        {
            if(b[i] - flag >= a[i])
            {
                temp = b[i] - a[i] - flag;
               flag = 0;
            }
            else
            {
                temp = b[i] - a[i] + 10 - flag;
                flag = 1;
            }
            a[i] = temp % 10 + '0';
        }

        //去除前面的0
        while(a[0] == '0')
            a = a.substr(1);
        if (k)
            a = "-" + a;
    }
    return a;
} 

int main()
{
    string a, b;
    a = "99999999999999999";
    b = "1";
    cout << Add(a,b) <<endl;
    return 0;
}

大整数相乘

/*******************************************************************************
功    能:超长整数相加
创建时间: 2018-09-14
作    者:Elvan
修改时间:
作    者:
********************************************************************************/
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

//字符串相加函数
string add(string a, string b){
    //都是正数
    if (a[0] != '-' && b[0] != '-'){
        while (a.size() < b.size())
            a = "0" + a;
        while (a.size() > b.size())
            b = "0" + b;

        int temp = 0, flag = 0;
        for (int i = a.size() - 1; i >= 0; i--){
            temp = a[i] - '0' + b[i] - '0' + flag;
            a[i] = temp % 10 + '0';
            if (temp >= 10)
                flag = 1;
            else
                flag = 0;
        }
        if (flag == 1)
            a = "1" + a;
    }
    return a;
}

//字符串乘一个字符函数
string multiplyHelper(string str, char x){
    int b = x - '0';
    int flag = 0;  //进位标识符
    for (int i = str.length() - 1; i >= 0; i--){
        int a = str[i] - '0';
        int result = a*b + flag;
        str[i] = result % 10 + '0';
        flag = result / 10;
    }
    if (flag != 0)
        str = (char)(flag + '0') + str;
    while (str.length() > 1 && str[0] == '0')
        str = str.substr(1);
    return str;
}


//字符串相乘函数
string multiply(string a, string b){
    string res = "";
    if (a.length() == 0 || b.length() == 0)
        return "";
    bool flag = false;
    string strA = a, strB = b;
    //如果a是负数
    if (a[0] == '-'){
        flag = ~flag;
        strA = a.substr(1);
    }
    //如果b是负数
    if (b[0] == '-'){
        flag == true ? flag = false : flag = true;
        strB = b.substr(1);
    }

    for (int i = strB.length() - 1; i >= 0; i--){
        string result = multiplyHelper(strA, strB[i]);
        int j = i;
        while (++j < strB.length())
            result = result + "0";
        res = add(res, result);
    }

    while (res.length() > 1 && res[0] == '0')
        res = res.substr(1);
    if (flag == true && res != "0")
        res = '-' + res;
    return res;
}


int main(){
    string a = "12", b = "13";
    string tmp = multiply(a, b);
    cout << tmp << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_38169413/article/details/82698617