【算法模板】高精度基本操作

主函数:

#include<iostream>
#include<string>
#include<cstring>

using namespace std;

int a[1000],b[1000],c[1000];

void read(int a[])

void write(int a[]);

void add(int a[],int b[]);

int main()
{
    read(a);
    read(b);
    add(a,b);
    write(c);
}

输入输出:

void read(int a[])
{
    string s;
    cin>>s;
    a[0]=s.size();
    for(int i=0; i<a[0]; i++)
        a[a[0]-i]=s[i]-'0';
}
void write(int a[])
{
    for(int i=a[0]; i>=1; i--)
        cout<<a[i];
    cout<<endl;
}

加法:

void add(int a[],int b[])
{
    memset(c,0,sizeof(c));
    c[0]=a[0]>b[0]?a[0]:b[0];
    int g=0;
    for(int i=1; i<=c[0]; i++)
    {
        c[i]=a[i]+b[i]+g;
        g=c[i]/10;
        c[i]%=10;
    }
    if(g!=0)c[++c[0]]=g;
}

减法:

bool check(int a[],int b[])
{
    if(a[0]>b[0])return false;
    if(a[0]<b[0])return true;
    for(int i=a[0]; i>=1; i--)
    {
        if(a[i]<b[i])
            return true;
        if(a[i]>b[i])
            return false;
    }
    return false;
}

void subtract(int a[],int b[])
{
    if(check(a,b))
    {
        int *p;//交换两个数组
        p=a;
        a=b;
        b=p;
    }
    memset(c,0,sizeof(c));
    for(int i=1; i<=a[0]; i++)
    {
        if(a[i]<b[i])
        {
            a[i]+=10;
            a[i+1]--;
        }
        c[i]=a[i]-b[i];
    }
    //记录数组长度,末位清空
    int len=a[0];
    while(c[len]==0&&len!=1)len--;
    c[0]=len;
}

乘法(高*单):

void multiply(int a[],int k)
{
    memset(c,0,sizeof(c));
    int g=0;
    for(int i=1; i<=a[0]; i++)
    {
        c[i]=a[i]*k+g;
        g=c[i]/10;
        c[i]%=10;
    }
    int len=a[0];
    while(g!=0)
    {
        c[++len]=g%10;
        g/=10;
    }
    c[0]=len;
}

乘法(高*高):

void multiply(int a[],int b[])
{
    memset(c,0,sizeof(c));
    for(int i=1; i<=a[0]; i++)
        for(int j=1; j<=b[0]; j++)
            c[i+j-1]+=a[i]*b[j];
    int len=a[0]+b[0]-1;
    int g=0;
    for(int i=1; i<=len; i++)
    {
        c[i]+=g;
        g=c[i]/10;
        c[i]%=10;
    }
    while(g!=0)
    {
        c[++len]=g%10;
        g/=10;
    }
    c[0]=len;
}

高精度除单精度:

void divide(int a[],int k)
{
    memset(c,0,sizeof(c));
    int r=0;
    for(int i=a[0]; i>=1; i--)
    {
        c[i]=a[i]+r*10;
        r=c[i]%k;
        c[i]/=k;
    }
    int len=a[0];
    while(c[len]==0&&len!=1)len--;
    c[0]=len;
}

高精度除高精度:

void divide(int a[],int b[])
{
    memset(c,0,sizeof(c));
    while(!check(a,b))
    {
        subtract(a,b);
        add(c,1);
    }
}
void subtract(int a[],int b[])
{
    for(int i=1; i<=a[0]; i++)
    {
        if(a[i]<b[i])
        {
            a[i]+=10;
            a[i+1]--;
        }
        a[i]-=b[i];
    }
    int len=a[0];
    while(a[len]==0&&len!=1)len--;
    a[0]=len;
}
void add(int a[],int k)
{
    a[1]+=k;
    int len=1;
    while(a[len]>9)
    {
        a[len+1]+=a[len]/10;
        a[len]%=10;
        len++;
    }
    if(len>a[0])a[0]=len;
}
bool check(int a[],int b[])
{
    if(a[0]>b[0])return false;
    if(a[0]<b[0])return true;
    for(int i=a[0]; i>=1; i--)
        if(a[i]<b[i])return true;
    return false;
}

猜你喜欢

转载自blog.csdn.net/ezluoyiqi/article/details/82935377
今日推荐