关闭

高精度算法数据结构及常用函数实现(C++)

标签: 数据结构c++算法hpstructc
2717人阅读 评论(0) 收藏 举报
分类:

高精度算法在各种编程题目以及实际应用中很常见,这里给出最常见的思路和一组函数实现。

结构体hp描述这个数字,成员len表示数字长度,s[]记录每一位上的数字,其实只记10个数,用int有点浪费,某些特定场合可以用char定义s[],只是相应的程序部分也必须做一些更改。

然后用最原始的办法一位一位计算得出结果。

当然这组函数只是示范思路,还不能进行复杂的数学运算,但这个基础上写出更复杂运算的函数相信并不困难^_^

高精度常用函数实现(C++)
#define maxsize 100

struct hp
{
    int len;
    int s[maxsize+1];
};


void input(hp &a,string str)
{
    int i;
    while(str[0]=='0' && str.size()!=1)
        str.erase(0,1);
    a.len=(int)str.size();
    for(i=1;i<=a.len;++i)
        a.s[i]=str[a.len-i]-48;
    for (i=a.len+1;i<=maxsize;++i)
        a.s[i]=0;
}

void print(const hp &y)
{
    int i;
    for(i=y.len;i>=1;i--)
        cout<<y.s[i];
    cout<<endl;
}

void plus(const hp &a,const hp &b,hp &c) //高精度加法c=a+b
{
    int i,len;
    for(i=1;i<=maxsize;i++) c.s[i]=0;
    if(a.len>b.len) len=a.len;
    else len=b.len;
    for(i=1;i<=len;i++)
    {
        c.s[i]+=a.s[i]+b.s[i];
        if(c.s[i]>=10)
        {
            c.s[i]-=10;
            c.s[i+1]++;
        }
    }
    if(c.s[len+1]>0) len++;
    c.len=len;
}

void subtract(const hp &a,const hp &b,hp &c) //高精度减法c=a-b
{
    int i,len;
    for(i=1;i<=maxsize;i++) c.s[i]=0;
    if(a.len>b.len) len=a.len;
    else len=b.len;
    for(i=1;i<=len;i++)
    {
        c.s[i]+=a.s[i]-b.s[i];
        if(c.s[i]<0)
        {
            c.s[i]+=10;
            c.s[i+1]--;
        }
    }
    while(len>1&&c.s[len]==0) len--;
    c.len=len;
}

int compare(const hp &a,const hp &b)
{
    int len;
    if(a.len>b.len) len=a.len;
    else len=b.len;
    while(len>0 && a.s[len]==b.s[len]) len--;
    if(len==0) return 0;
    else return a.s[len]-b.s[len];
}

void multiply(const hp &a,int b,hp &c) //高精度*单精度
{
    int i,len;
    for(i=1;i<=maxsize;i++) c.s[i]=0;
    len=a.len;
    for(i=1;i<=len;i++)
    {
        c.s[i]+=a.s[i]*b;
        c.s[i+1]+=c.s[i]/10;
        c.s[i]%=10;
    }
    len++;
    while(c.s[len]>=10)
    {
        c.s[len+1]+=c.s[len]/10;
        c.s[len]%=10;
        len++;
    }
    while(len>1&&c.s[len]==0) len--;
    c.len=len;
}

void multiplyh(const hp &a,const hp &b,hp &c) //高精度*高精度
{
    int i,j,len;
    for(i=1;i<=maxsize;i++) c.s[i]=0;
    for(i=1;i<=a.len;i++)
        for(j=1;j<=b.len;j++)
        {
            c.s[i+j-1]+=a.s[i]*b.s[j];
            c.s[i+j]+=c.s[i+j-1]/10;
            c.s[i+j-1]%=10;
        }
    len=a.len+b.len+1;
    while(len>1&&c.s[len]==0) len--;
    c.len=len;
}

void divide(const hp &a,int b,hp &c,int &d) //高精度/单精度 {d为余数}
{
    int i,len;
    for(i=1;i<=maxsize;i++) c.s[i]=0;
    len=a.len;
    d=0;
    for(i=len;i>=1;i--)
    {
        d=d*10+a.s[i];
        c.s[i]=d/b;
        d%=b;
    }
    while(len>1&&c.s[len]==0) len--;
    c.len=len;
}

void multiply10(hp &a)     //高精度*10
{
    int i;
    for(i=a.len;i>=1;i--)
        a.s[i+1]=a.s[i];
    a.s[1]=0;
    a.len++;
    while(a.len>1&&a.s[a.len]==0) a.len--;
}

void divideh(const hp &a,const hp &b,hp &c,hp &d)//高精度/高精度{d为余数}
{
    hp e;
    int i,len;
    for(i=1;i<=maxsize;i++)
    {
        c.s[i]=0;
        d.s[i]=0;
    }
    len=a.len;
    d.len=1;
    for(i=len;i>=1;i--)
    {
        multiply10(d);
        d.s[1]=a.s[i];
        while(compare(d,b)>=0)
        {
            subtract(d,b,e);
            d=e;
            c.s[i]++;
        }
    }
    while(len>1&&c.s[len]==0) len--;
    c.len=len;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:131811次
    • 积分:2090
    • 等级:
    • 排名:第18839名
    • 原创:69篇
    • 转载:11篇
    • 译文:2篇
    • 评论:39条
    最新评论