0508高精度 10进制 VS 2进制

这篇博客详细介绍了高精度计算的四个基本操作:加法、减法、乘法和除法,并给出了每个操作的具体实现思路。此外,还讨论了如何将一个十进制数转换为其二进制逆序数,涉及高精度除法和乘法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

791.高精度加法

给定两个正整数(不含前导 00),计算它们的和。

输入格式

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

输出格式

共一行,包含所求的和。

数据范围

1≤整数长度≤100000

输入样例:

12
23

输出样例:

35

分析

高精度+高精度

就是列加法算式的思想

Code
#include<iostream>
#include<vector>
using namespace std;
vector<int> A,B;
string a,b;
vector<int> add(vector<int> A,vector<int> B)
{
    vector<int> c;
    if(A.size()<B.size())//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;
}
int main()
{
    cin>>a>>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 C=add(A,B);
    for(int i=C.size()-1;i>=0;i--)
    cout<<C[i];
    
    return 0;
}

792.高精度减法

给定两个正整数(不含前导 00),计算它们的差,计算结果可能为负数。

输入格式

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

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤105

输入样例:

32
11

输出样例:

21

分析

高精度-高精度

就是列减法算式的思想,注意前导零的特殊处理

Code
#include<iostream>
#include<vector>
using namespace std;
vector<int> A,B;
string a,b;
bool cmp(vector<int> A,vector<int> B)
{
    if(A.size()!=B.size())
    return A.size()>B.size();
    else
    {
        for(int i=A.size()-1;i>=0;i--)
            if(A[i]!=B[i])
                return A[i]>B[i];
    }
    return true;
}
vector<int> sub(vector<int> A,vector<int> B)
{
    vector<int> C;
    if(!cmp(A,B))//A>B
    return sub(B,A);
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t=A[i]-t;
        if(i<B.size())
        t-=B[i];
        C.push_back((t+10)%10);
        if(t<0)
        t=1;
        else t=0;
    }
    while(C.size()>1&&C.back()==0)C.pop_back();//剔出前导0 如222-222=000->0
    return C;
    
}
int main()
{
    cin>>a>>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');
    
    if(cmp(A,B))
    {
        auto C=sub(A,B);
        for(int i=C.size()-1;i>=0;i--)
        cout<<C[i];
    }
    else
    {
        auto C=sub(B,A);
        cout<<'-';
        for(int i=C.size()-1;i>=0;i--)
        cout<<C[i];
    }
    return 0;
}

793.高精度乘法

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

输入格式

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

输出格式

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

数据范围

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

输入样例:

2
3

输出样例:

6

分析

高精度x低精度

就是列减法算式的思想,注意前导零的特殊处理

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

794.高精度除法

给定两个非负整数(不含前导 00) A,B,请你计算 A/B的商和余数。

输入格式

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

输出格式

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

数据范围

1≤A的长度≤100000,
1≤B≤10000,
B一定不为 00

输入样例:

7
2

输出样例:

3
1

分析

一口气把高精度的四种运算写完,感觉就除法的思想相对难想到。

Code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> A;
string a;
int b;
vector<int> div(vector<int> A,int b,int &r)
{
    vector<int> C;
    r=0;
    for(int i=A.size()-1;i>=0;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)//剔除前导0
    C.pop_back();
    return C;
}
int main()
{
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)
    A.push_back(a[i]-'0');
    int r=0;
    auto C=div(A,b,r);
    for(int i=C.size()-1;i>=0;i--)
    cout<<C[i];
    cout<<endl<<r;
    return 0;
}

3395. 10进制 VS 2进制

对于一个十进制数 A,将 A转换为二进制数,然后按位逆序排列,再转换为十进制数 B,我们称 B为 A的二进制逆序数。

例如对于十进制数 173,它的二进制形式为 10101101,逆序排列得到 10110101,其十进制数为 181,181即为 173的二进制逆序数。

输入格式

一个十进制数 A。

输出格式

输出 A的二进制逆序数 B。

数据范围

A是正整数且不超过 1000位。

输入样例:

173

输出样例:

181

分析

根据题面和数据范围可以看出,和高精度运算有关。

1.十进制数转为二进制数,通过短除法可以实现,这就需要高精度除法(高精度/2),最后得到的余数序列就是所要求的二进制数。

2.不必专门对二进制数进行逆序操作,因为上步得到的序列本来就是逆序存储。

3.二进制数转为十进制数,使用秦九韶算法,这就需要高精度乘法(高精度*2)和高精度加法(高精度+x)。

Code
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
string a;
vector<int> div(vector<int> &A,int b,int &r)
{
    vector<int> C;
    r=0;
    for(int i=A.size()-1;i>=0;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;
}
vector<int> mul(vector<int> A,int b)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t=A[i]*b+t;
        C.push_back(t%10);
        t/=10;
    }
    if(t)C.push_back(t);
    while(C.size()>1&&C.back()==0)C.pop_back();
    return C;
}
vector<int> add(vector<int> A,int b)
{
    vector<int> C;
    int t=b;
    for(int i=0;i<A.size();i++)
    {
        t+=A[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t)C.push_back(t);
    return C;
}
void print(vector<int> &a)
{
    for(int i=a.size()-1;i>=0;i--)
    cout<<a[i];
    cout<<endl;
}
int main()
{
    cin>>a;
    vector<int> A;
    for(int i=a.size()-1;i>=0;i--)
    A.push_back(a[i]-'0');
    vector<int> B;//保存二进制的A
    //A转二进制 高精度除法 余数的序列即为转换后的二进制数
    while(A.size()>1||A[0]!=0)
    {
        int r;
        A=div(A,2,r);
        B.push_back(r);
    }
    //print(B);
    //二进制逆序 B
    //二进制转十进制,秦九韶算法 高精度加法+高精度乘法
    vector<int> C;//保存十进制ans
    for(int x:B)
    {
        C=mul(C,2);
        C=add(C,x);
    }
    print(C);
}
freetalk

背模版模版模版!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值