高精度

高精度加法

题目描述

高精度加法,相当于a+b problem,不用考虑负数.

输入格式

分两行输入。\(a,b \leq 10^{500}\)

输出格式

输出只有一行,代表\(a+b\)的值

输入 #1

1
1

输出 #1

2

输入 #2

1001
9099

输出 #2

10100

题目链接

P1601

代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//C=A+B,A>=0,B>=0
vector<int> add(vector<int> &A,vector<int> &B)
{
    vector<int> C;
    if(A.size()<B.size())return add(B,A);
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t+=A[i];
        if(i<B.size())t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t)C.push_back(t);
    return C;
}

vector<int> A,B,C;
string a,b;
int main()
{
    cin>>a>>b;
    for(int i=a.size()-1;~i;i--)
        A.push_back(a[i]-'0');
    for(int i=b.size()-1;~i;i--)
        B.push_back(b[i]-'0');
    C=add(A,B);
    for(int i=C.size()-1;~i;i--)
        printf("%d",C[i]);
    return 0;
}

高精度减法

题目描述

高精度减法。

输入格式

两个整数 \(a,b\)(第二个可能比第一个大)。

输出格式

结果(是负数要输出负号)。

输入 #1

2
1

输出 #1

1

说明/提示

  • \(20\%\) 数据 \(a,b\) 在 long long 范围内;
  • \(100\%\) 数据 \(0<a,b\le 10^{10086}%\)

题目链接

P2142

代码

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

//C=A-B,满足A>=B,A>=0,B>=0
vector<int> sub(vector<int> &A,vector<int> &B)
{
    vector<int> C;
    for(int i=0,t=0;i<A.size();i++)
    {
        t=A[i]-t;
        if(i<B.size())t-=B[i];
        C.push_back((t+10)%10);
        t=t<0?1:0;
    }
    while(C.size()>1&&C.back()==0)C.pop_back();
    return C;
}


vector<int> A,B,C;
string a,b;
int main()
{
    cin>>a>>b;
    if(a.size()<b.size()||(a.size()==b.size()&&a<b))putchar('-'),swap(a,b);
    for(int i=a.size()-1;~i;i--)
        A.push_back(a[i]-'0');
    for(int i=b.size()-1;~i;i--)
        B.push_back(b[i]-'0');
    C=sub(A,B);
    for(int i=C.size()-1;~i;i--)
        printf("%d",C[i]);
    return 0;
}

高精度乘法

高精度\(\times\)低精度

题目描述

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。

输入格式

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

输出格式

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

数据范围

\(1≤A的长度≤100000\),
\(0≤B≤10000\)

输入样例:

2
3

输出样例:

6

题目链接

acwing793. 高精度乘法

代码

//高精度*低精度
#include<bits/stdc++.h>
using namespace std;
//C=A*b
vector<int> mul(vector<int> A,int b)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size()||t;i++)
    {
        if(i<A.size())t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    while(C.size()>1&&C.back()==0)C.pop_back();
    return C;
}
int main()
{
    vector<int> A;
    string a;
    int b;
    cin>>a>>b;
    for(int i=a.size()-1;~i;i--)A.push_back(a[i]-'0');
    vector<int> C=mul(A,b);
    for(int i=C.size()-1;~i;i--)cout<<C[i];
    return 0;
}

高精度\(\times\)高精度

题目描述

求两数的积。

输入格式

两行,两个整数。

输出格式

一行一个整数表示乘积。

输入

1
2

输出

2

说明/提示

每个数字不超过 \(10^{2000}\) ,需用高精。

题目链接

P1303 A*B Problem

代码

//高精度*高精度
#include<bits/stdc++.h>
using namespace std;
//C=A*B
vector<int>mul(vector<int> A,vector<int> B)
{
    vector<int> C(A.size()+B.size()+1);
    for(int i=0;i<A.size();i++)
        for(int j=0;j<B.size();j++)
        {
            C[i+j]+=A[i]*B[j];
            C[i+j+1]+=C[i+j]/10;
            C[i+j]%=10;
        }
    while(C.size()>1&&C.back()==0)C.pop_back();
    return C;
}
int main()
{
    vector<int> A,B,C;
    string a,b;
    cin>>a>>b;
    for(int i=a.size()-1;~i;i--)A.push_back(a[i]-'0');
    for(int i=b.size()-1;~i;i--)B.push_back(b[i]-'0');
    C=mul(A,B);
    for(int i=C.size()-1;~i;i--)cout<<C[i];
    return 0;
}

高精度\(\div\)低精度

题目描述

输入两个整数 \(a,b\),输出它们的商。

输入格式

两行,第一行是被除数,第二行是除数。

输出格式

一行,商的整数部分。

输入

10
2

输出

5

说明/提示

\(0≤a≤10^{5000} ,1\le b\le 10^9\)

题目链接

P1480 A/B Problem

acwing794. 高精度除法

代码

//高精度/低精度
#include<bits/stdc++.h>
using namespace std;
//A/b=C……r,A>=0,b>0
vector<int> div(vector<int> A,int b,long long &r)
{
    vector<int> C;
    r=0;
    for(int i=A.size()-1;~i;i--)
    {
        r=r*10+A[i];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());
    while(C.size()>1&&C.back()==0)C.pop_back();
    return C;
}
int main()
{
    vector<int> A,C;
    string a;
    int b;
    long long r;
    cin>>a>>b;
    for(int i=a.size()-1;~i;i--)A.push_back(a[i]-'0');
    C=div(A,b,r);
    for(int i=C.size()-1;~i;i--)cout<<C[i];//商
    putchar('\n');
    //cout<<r;//余数
    return 0;
}
posted @ 2021-08-31 21:46  zyy2001  阅读(77)  评论(0编辑  收藏  举报