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

原创 2006年06月19日 03:03:00

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

结构体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;
}

相关文章推荐

约瑟夫问题解决及实现代码(C语言版)

约瑟夫问题: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了...

约瑟夫环问题(顺序表)——C++实现

#include #include #define MAXSIZE 100//人数上限 using namespace std; typedef int DataType; typedef stru...

数据结构常用算法c++实现

  • 2014年08月22日 21:09
  • 1.55MB
  • 下载

高精度算法的c++实现

  • 2010年12月06日 18:53
  • 3KB
  • 下载

c/c++常用算法(3) -- 数据结构(栈)

一、概念:     栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出(LIFO(Last In First Out)或先进后出(FILO(First In Last ...

C C++ 常用数据结构 算法

  • 2008年09月05日 14:18
  • 33.26MB
  • 下载

c/c++常用算法(4) -- 数据结构(队列)

一、概念     队列(Queue):也是运算受限的线性表。是一种先进先出(FirstIn FirstOut ,简称FIFO)的线性表。只允许在表的一端进行插入,而在另一端进行删除。 ...

c/c++常用算法(6) -- 数据结构(图)

一、概念 1.图、树、线性结构区别:     图(Graph)是一种比线性表和树更为复杂的数据结构。     图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关...

c/c++常用算法(2) -- 数据结构(线性表的链式存储)

一、线性表的链式存储结构  链式存储:用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性表简称线性链表。    存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是...

c/c++常用算法(15) -- 经典数据结构(城市之间的最短距离问题)

一、最短总距离算法: 1.描述 我们先来分析一下这个问题。某个地区n个城市构成一个交通图,我们可以使用图结构来描述这个问题,其对应关系如下: 每个城市代表一个图中的一个顶点。两个顶点之间的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高精度算法数据结构及常用函数实现(C++)
举报原因:
原因补充:

(最多只允许输入30个字)