高精度运算_加法 减法

由于c++不能进行位数过高的数据运算,如果超过数量级,就需要使用高精度算法。通过charstring形式模拟数字输入,然后将每个字符转换到数组中,通过数组进行计算。

Int 4个字节,范围[-231,231-1] ,转换位10进制数量级为10^9^{}

Long long  8个字节,范围[-263,263-1] ,转换位10进制数量级为10^18

高精度加法

原理:

1)输入字符str_a=3125 str_b=369

2)将str_a 倒叙存入数组a[4]={5,2,1,3}, str_b 倒叙存入数组b[3]={9,6,3}

3)数组a和数组b从第0位开始求和,如果和大于10就进位。

    int len = max(a_len , b_len);

    int x = 0; //大于10时的进位

    for ( int i = 0; i <len ;i ++)

    {

        int  sum = a[i] + b[i] + x;

        c[i] = sum % 10;

        x= sum / 10;

    }

描述

输入两个正整数(数位可能不同也许存在进位),计算并输出数字和。

输入描述

2行。每行一个正整数。(10<=位数<=2000)

输出描述

一个数字。表示数字和。

样例输入 

66666666666666666666
5555555512

样例输出

66666666672222222178

代码实现

#include <bits/stdc++.h>
using namespace std;
int main() {    
    string  str_a, str_b ; //输入的正整数
    int a[2000]={},b[2000]={},c[2001]={}; //str_a转化至数组a ,str_b转化至数组b
    cin >> str_a >> str_b;
    int a_len = str_a.length();  
    for (int i = 0; i <a_len; i++)
    {
        a[a_len-1-i]=str_a[i]-'0';
    }

    int b_len = str_b.length();  
    for (int i = 0; i <b_len; i++)
    {
        b[b_len-1-i]=str_b[i]-'0';
    }
    int len = max(a_len , b_len);
    int x = 0; //大于10时的进位
    for ( int i = 0; i <len ;i ++)
    {
        int sum = 0;
        sum = a[i] + b[i] + x;
        c[i] = sum % 10;
        x= sum / 10;
    }
    if (x > 0)
    {
        cout << x;
    }
    for (int i = len-1; i>=0 ;i--)
    {
        cout << c[i];
    }
    return 0;
}

高精度减法

原理:

(1)与加法不同,高精度减法是借位,如果当前位不够减从高位借位。

int len =max(a_len , b_len);
    for ( int i = 0; i <len ;i ++)
    {
        if(a[i]-b[i]<0)
        {
            a[i+1]--;
            a[i]+= 10 ;
        }
        c[i] = a[i] - b[i] ;
    }

(2)得到得差有可能会有多个0,需要去掉。如:8891-8805从个位开始减,输出时按照从高位开始输出:0086,需要将86前面的0去掉。

while (c[len-1]==0 && len > 1)
    {
        len--;
    }

描述

输入两个数位相同的正整数,计算并输出两个数的差,第一个整数大于第二个整数,但是可能存在第一个正整数某一位小于第二个正整数对应位。

输入描述

2行。每行一个正整数。(10<=位数<=2000

输出描述

一个数字。表示两个正整数的差。

样例输入

88888888886666666666
44444444443333333789

样例输出

44444444443333332877

代码实现

#include <bits/stdc++.h>
using namespace std;
int main() {    
    string  str_a, str_b ; //输入的正整数
    int a[2000]={},b[2000]={},c[2001]={}; //str_a转化至数组a ,str_b转化至数组b
    cin >> str_a >> str_b;
    int a_len = str_a.length();  
    for (int i = 0; i <a_len; i++)
    {
        a[a_len-1-i]=str_a[i]-'0';
    }
    int b_len = str_b.length();  
    for (int i = 0; i <b_len; i++)
    {
        b[b_len-1-i]=str_b[i]-'0';
    }
    int len =max(a_len , b_len);
    for ( int i = 0; i <len ;i ++)
    {
        if(a[i]-b[i]<0)
        {
            a[i+1]--;
            a[i]+= 10 ;
        }
        c[i] = a[i] - b[i] ;
    }
    while (c[len-1]==0 && len > 1)
    {
        len--;
    }
    for (int i = len-1; i>=0 ;i--)
    {
        cout << c[i];
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值