整数高精度之加减法

高精度计算是一种程序设计的算法。由于中央处理器的字长限制,如32位CPU中一个整数最大只能取值4,294,967,295。因此在进行更大范围的数值计算中,往往要采取模拟手段。通常通过分离字符的方法通过数字数组进行输入。通过数组倒序输出。通过模拟竖式计算进行计算。这里我们只讨论正整数的运算,其中加法和减法都是最基本的运算,乘除法运算是建立在加减法之上的。

加法的实现算法:

1. 对位,在加数和被加数的前面补上适当数量的0,直到他们的位数一样;

2. 对位后,在加速和被加数前再补一个0,以确定和的最多位数;

3. 从低位开始相加,用一个变量记录进位,每次相加都将对位的加数和被加数以及进位进行求和,将结果保存,然后更新进位变量;

4. 删除答案前面多余的0;


减法的实现算法:

1. 比较加数和被减数的大小,保证被减数为大,且进行记录,然后给被减数前面补0,直到他们的位数一样;

2. 与加法相反,从高位减起(当然从低位减也是可以的),若对位的被减数较大或相等,则直接相减;否则,向前回溯至被减数位不为0,然后对其减1,,按借位的规则进行

    赋值;

    例如: 31004 - 00005,在进行到最后一位的时候,发现被减数位较小,则向前回溯至第二位1,将第二位减1,给其他0为赋值9,然后用14减去5,最后得到最后结果:

30999  

3. 删除答案前面多余的0;

4. 如果原本的被减数较小,则在最后结果前加‘-’;


实现代码:

addition.cpp

#include <iostream>
#include <string>

using namespace std;

string s1, s2;

string add(string a, string b)
{
    string ans;
    int size1= a.size(), size2 = b.size();
    // 补位 
    if (size1 > size2) 
        for (int i = 0; i < size1 - size2; ++ i)
            b = "0" + b;
    else if (size2 > size1)
        for (int i = 0; i < size2 - size1; ++ i)
            a = "0" + a;
    // 再补一次0 
    a = "0" + a;
    b = "0" + b;
    ans = a; 
    size1 = a.size();
    // 用以记录进位 
    int carry = 0;
    // 对每位进行加法模拟 
    for (int i = size1 - 1; i >= 0; -- i)
    {
        int tmp = a[i] - '0' + b[i] - '0' + carry;
        if (tmp < 10)
        {
            ans[i] = '0' + tmp;
            carry = 0;
        }
        else
        {
            ans[i] = tmp - 10 + '0';
            carry = 1;
        }
    }
    // 去除答案前面多余的0 
    int i = 0;
    while (ans[i] == '0' && i < size1 - 1) { i ++; }
    ans = ans.substr(i);
    return ans;
}
// 测试 
int main()
{
    while (cin >> s1 >> s2)
    {
        cout << add(s1, s2) << endl;
    }
    return 0;
}

subtraction.cpp

#include <iostream>
#include <string>
using namespace std;

string s1, s2;

string sub(string a, string b)
{
    int size1 = a.size(), size2 = b.size(), tmp;
    bool negative  = 0;
    string st, ans;
    // 确保被减数大于减数,并进行标记 
    if (size1 < size2 || (size1 == size2 && a < b))
    {
        st = a; a = b; b = st;
        negative = 1;
    }
    size1 = a.size();
    size2 = b.size();
    // 给减数补0 
    for (int i = 0; i < size1 - size2; ++ i)
        b = '0' + b;
    ans = a;
    // 对每位进行减法模拟 
    for (int i = 0; i < size1; ++ i)
    {
        tmp = a[i] - b[i];
        if (tmp >= 0)
            ans[i] = '0' + tmp;
        else
        {
            int j = i - 1;
            // 向前回溯至某为位不为0 
            while(j >= 0 && ans[j] == '0')
            {
                ans[j] = '9';
                j --;
            }
            ans[i] = 10 + tmp + '0';
            ans[j] = ans[j] - 1;
        }
    }
    // 去除答案前面多余的0 
    int i = 0;
    while (ans[i] == '0' && i < size1 - 1) i ++;
    ans = ans.substr(i);
    // 给答案前加'-'
    if (negative) ans = '-' + ans;
    return ans;
}

int main()
{
    while (cin >> s1 >> s2)
    {
        cout << sub(s1, s2) << endl;
    }
    return 0;
}


样例测试:

addition:


subtraction:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值