高精度算法

目录

高精度加法

 代码

 高精度减法

 思考

 代码

 高精度乘法

题目

代码

 carry进位分析

高精度除法

题目

 代码

 模拟除法的过程


高精度加法

高精度算法_第1张图片

 代码

#include 
#include 

using namespace std;

vector add(vector A,vector B)
{
    if(A.size() C;
    int carry=0;//用来表示进位
    for(int i=0;i>a>>b;
    
    //a和b倒着存入vector里面,因为有进位,所以倒着存储
    vector 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<

 高精度减法

高精度算法_第2张图片

 思考

1. 如何处理借位问题?

2. 如果相减之后是负数该怎么办?

3. 如何处理前导0?

答1:类似于高精度加法中的carry,记录每一位相减之后是不是负数,如果是,则在下一次相减的时候先要处理上一次的借位问题

答2:如果数字A-B为负数,那我们只需要先输出一个负号,然后再输出B-A的值就行

答3:在保证相减之后不为空的情况下一步一步丢弃前导0

 代码

#include 
#include 

using namespace std;

bool cmp(vector A,vector B)//用来判断A是否大于等于B
{
    if(A.size()>B.size()) return true;
    if(A.size()B.size();    

    for(int i=A.size()-1;i>=0;i--)
    if(A[i]!=B[i]) return A[i]>B[i];
    return true;
    /*
    这三行代码不建议这样写
    for(int i=A.size()-1;i>=0;i--)
    if(A[i]>B[i]) return true;
    return false;
    因为这样子如果在A和B相等的情况下,我们应该返回true,
    让他在主函数里面不输出负号
    */
}

vector sub(vector A, vector B)
{
    vector C;
    
    for(int i=0,carry=0;i1)C.pop_back();
    
    return C;
}

int main()
{
    string a,b;
    cin>>a>>b;
    
    vector 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');
    
    vector C;
    if(cmp(A,B))C=sub(A,B);//如果A大于等于B,则直接相减
    else//A小于B需要先输出负号
    {
        C=sub(B,A);
        cout<<"-";
    }
    
    for(int i=C.size()-1;i>=0;i--)cout<

 高精度乘法


题目

高精度算法_第3张图片

 整体思路和高精度加法差不多

代码

#include 
#include 

using namespace std;

vector mul(vector A, int b)
{
    vector C;
    int carry=0;//carry是用来处理进位的,不过这里的进位可能比较大
    
    for(int i=0;i>a>>b;
    
    if(b==0)//如果b=0,那不管a是啥,结果都为0
    {
        cout<<0< A;
    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<

 carry进位分析

高精度算法_第4张图片

高精度除法

题目

高精度算法_第5张图片

 代码
 

#include 
#include 
#include 

using namespace std;

vector divide(vector A, int b, int &r)//取地址是因为我们要改变r的值
{
    vector C;
    for(int i=0;i1&&C.back()==0) C.pop_back();
    
    return C;
}

int main()
{
    string a;
    int b;
    cin>>a>>b;
    
    /*
    思考:这里为什么按照字符串a的正向顺序来存储呢?
    在加法、减法、乘法里面我们都是从低位开始算的,但是在除法中
    我们是从高位开始计算
    */
    vector A;
    for(int i=0;i=0;i--)cout<

 模拟除法的过程

高精度算法_第6张图片

如果你感觉对你有帮助的话,能留个点赞么。你的支持是我创作的最大动力(*^▽^*)

你可能感兴趣的:(算法,c++,开发语言)