高精度计算 加减乘除

4.高精度计算

791. 高精度加法

给定两个正整数,计算它们的和。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的和。

数据范围

1≤整数长度≤1000001≤整数长度≤100000

输入样例:

12
23

输出样例

35
#include<iostream>
#include<vector>
using namespace std;

//默认a更长
vector<int> add( vector<int> &a,  vector<int> &b){
    if(b.size()>a.size()) return add(b,a);
    //位对齐
    while (b.size() != a.size()) b.push_back(0);
    vector<int> res(a.size()+1);
    int i;
    for( i= 0; i <a.size()&&i<b.size(); i++){
        int t = (a[i]+b[i]+res[i])/10;
        res[i]=((a[i]+b[i])+res[i])%10;
        res[i+1] = t;
    }
    
    if(*(res.end()-1)==0) res.pop_back();
    return res;
}

int main(){
    string A,B;
    cin>>A>>B;
    vector<int> a;
    vector<int> b;
    for(int i = A.size()-1; i>=0; i--) a.push_back(A[i]-'0');
    for(int i = B.size()-1; i>=0; i--) b.push_back(B[i]-'0');
    
    auto res = add(a,b);
    for(int i = res.size()-1; i>=0; i--) cout<<res[i];
}

位对齐处理边界。

729.高精度减法

给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤1051≤整数长度≤105

输入样例:

32
11

输出样例

21
#include <iostream>
#include <vector>
using namespace std;
vector<int> sub(vector<int>& a, vector<int>& b) {
    vector<int> c;
    while (b.size() != a.size()) b.push_back(0);
    for (int i = 0; i < a.size(); i++) {
        //借位
        if (a[i] < b[i]) {
            a[i] += 10;
            a[i + 1]--;
        }
        c.push_back(a[i] - b[i]);
    }

 //移除末尾元素
     for(int i = c.size()-1;i>=0;i--){
        if(c[i]==0) c.pop_back(); 
        else break;
    }
    return c;
}
int main() {
    string sa;
    string sb;
    vector<int> a;
    vector<int> b;
    cin >> sa;
    cin >> sb;
    int op = 1;

    for (int i = sa.size() - 1; i >= 0; i--) a.push_back(sa[i] - '0');
    for (int i = sb.size() - 1; i >= 0; i--) b.push_back(sb[i] - '0');
    vector<int> c;
    
    //以下代码判断两个数的大小
    //若后一个数比前一个数要长,则
    if (b.size() > a.size()) op = -1;
    if(a.size()==b.size()){
        //若两者长度相等
        for(int i = a.size()-1; i>=0;i++){
            if(a[i]>b[i]) break;
            if(b[i]>a[i]){
                op = -1;
                break;
            }
        }
    }
    
    if(op==1) c = sub(a,b);
    else c = sub(b,a);
    
    if(c.size()==0){
        cout<<0;
        return 0;
    } 
    if(op==1)for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
    else{
        cout<<"-";
        for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
    } 
    return 0;

}

要先判断谁大谁小,再调用sub(a,b) 默认a比b大。

位对齐处理边界。

794.高精度乘法

给定两个正整数A和B,请你计算A * B的值。

输入格式

共两行,第一行包含整数A,第二行包含整数B。

输出格式

共一行,包含A * B的值。

数据范围

1≤A的长度≤1000001≤A的长度≤100000,
0≤B≤100000≤B≤10000

输入样例:

2
3

输出样例

6
#include <iostream>
#include<vector>
using namespace std;

vector<int> mult(vector<int>& a, int b) {
    vector<int> c;
    int t = 0;
    for (int i = 0; i < a.size() || t != 0; i++) {
        int cur = 0;
        if (i < a.size()) cur = a[i] * b;
        else cur = 0;
        c.push_back((cur + t) % 10);
        t = (t +cur) / 10;//不能写成t/10+cur/10!!!
    }
    //去0
    for(int i = c.size()-1; i>0; i--){
        if(c[i]==0) c.pop_back();
        else break;
    }
    return c;
}
int main() {
    string sa;
    int b;
    cin >> sa >> b;
    vector<int> a;
    for (int i = sa.size() - 1; i >= 0; i--) a.push_back(sa[i] - '0');
    auto c = mult(a, b);
    for (int i = c.size() - 1; i >= 0; i--) cout << c[i];

}

注意(t+cur)/10不能写成t/10+cur/10!!!

794 .高精度除法

给定两个非负整数A,B,请你计算 A / B的商和余数。

输入格式

共两行,第一行包含整数A,第二行包含整数B。

输出格式

共两行,第一行输出所求的商,第二行输出所求余数。

数据范围

1≤A的长度≤1000001≤A的长度≤100000,
1≤B≤100001≤B≤10000
BB 一定不为0

输入样例:

7
2

输出样例:

3
1
#include <iostream>
#include<vector>
using namespace std;


vector<int> mult(vector<int>& a, int b, int &r) {
    vector<int> c;
    for (int i = 0; i < a.size() || t != 0; i++) {
        int cur = 0;
        if (i < a.size()) cur = a[i] * b;
        else cur = 0;
        c.push_back((cur + t) % 10);
        t = (t +cur) / 10;//不能写成t/10+cur/10
    }
    //去0
    for(int i = c.size()-1; i>0; i--){
        if(c[i]==0) c.pop_back();
        else break;
    }
    return c;
}
int main() {
    string sa;
    int b;
    cin >> sa >> b;
    vector<int> a;
    //为了适配混合运算,所以还是倒着存
    for (int i = sa.size() - 1; i >= 0; i--) a.push_back(sa[i] - '0');
    r = 0;
    auto c = mult(a, &b,);
    

    for (int i = c.size() - 1; i >= 0; i--) cout << c[i];
    cout<<endl;
    cout<<b<<endl;

}

除法用余数,乘法加法用进位。

posted @ 2020-12-23 08:57  lsxkugou  阅读(70)  评论(0编辑  收藏  举报