高精度模板-阿里云开发者社区

开发者社区> 云计算> 正文
登录阅读全文

高精度模板

简介:                                                        #include #include #include #include #include using namespace ...

                                                       <<高精度模板>>

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cstring>
using namespace std;
#define maxsize 1005
//建立一个结构体
struct hp
{
    int len;//用来存储转化为整型后的长度
    int s[maxsize+1];//用来存储每一位
};
//copy  函数把b  copy给a
void copy(hp &a,hp &b)
{
    a.len=b.len;
    for(int i=1;i<=b.len;i++)
        a.s[i]=b.s[i];
}
//输入函数
void input(hp &a,string str)
{
    int i;
    while(str[0]=='0' && str.size()!=1)
        str.erase(0,1);//删除第一个元素
    a.len=(int)str.size();//把str的长度复制给a的len
    for(i=1;i<=a.len;++i)
        a.s[i]=str[a.len-i]-48;//a数组存储每一位,并且字符要逆向存入数组
    for (i=a.len+1;i<=maxsize;++i)
        a.s[i]=0;//剩下的为0
}
//输出函数
void print(const hp &y)
{
    int i;
    for(i=y.len;i>=1;i--)//注意输出是要后面向前输出i=y.len
        printf("%d",y.s[i]);
    cout<<endl;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1 高精度加法
void plusk(const hp &a,const hp &b,hp &c)
{
    int i,len;
    for(i=1;i<=maxsize;i++)
            c.s[i]=0;//初始化数组可以用memset
    //len为两者中的最大值
    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];//注意这里是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;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 高精度减法
void subtract(const hp &a,const hp &b,hp &c)
{
    int i,len;
    for(i=1;i<=maxsize;i++)
          c.s[i]=0;//初始化为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];//这个地方注意c.s[i]+=a.s[i]-b.s[i]
        if(c.s[i]<0)//如果小于0则要向前借位
        {
            c.s[i]+=10;//这里对应加10
            c.s[i+1]--;//前一位减1
        }
    }
    while(len>1&&c.s[len]==0)
           len--;//舍去前面的0
    c.len=len;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3 高精度比较
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];//a.s[len]-b.s[len]如果是负数则说明a小于b,反之
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4高精度*单精度
void multiply(const hp &a,int b,hp &c)
{
    int i,len;
    for(i=1;i<=maxsize;i++)
         c.s[i]=0;//初始化为0
    len=a.len;
    //计算乘法
    for(i=1;i<=len;i++)
    {
        c.s[i]+=a.s[i]*b;//把每一位乘上b存到结构体C里,这里是 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--;//舍去前面没用的0
    c.len=len;
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5高精度*高精度
void multiplyh(const hp &a,const hp &b,hp &c)
{
    int i,j,len;
    for(i=1;i<=maxsize;i++)
         c.s[i]=0;//初始化为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--;//舍去前面没用的0
    c.len=len;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
6高精度/单精度  {d为余数}
void divide(const hp &a,int b,hp &c,int &d)   
{
    int i,len;
    for(i=1;i<=maxsize;i++)
         c.s[i]=0;//初始化为0
    len=a.len;
    d=0;
    //注意除法的计算要从高位向下除
    for(i=len;i>=1;i--)
    {
        d=d*10+a.s[i];//计算
        c.s[i]=d/b;//存入c中
        d%=b;//d为于数
    }
    ////////////////////////////////
    while(len>1&&c.s[len]==0)
        len--;//舍去前面没用的0
    c.len=len;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
7 高精度*10
void multiply10(hp &a)    
{
    int i;
    //乘上10就是每一位都向前移动,而s[1]=0;
    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--;//舍去前面没用的0
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
8   高精度/高精度  {d为余数}
void divideh(const hp &a,const hp &b,hp &c,hp &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);//高进度乘上10
        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--;//舍去前面没用的0
    c.len=len;
}
///////////////////////////////////////////////////////////////////
hp sum[1003];//创建一个结构体数组
int main()
{
            int n=1002;
        hp a, b,c,tmp;
        c.len=0;
        a.s[1]=1;
        for(int i=2;i<1002;i++)
        {
                     b.s[i]=0;    
                     a.s[i]=0;
                 }
        for(int i=0;i<1002;i++)
        {
            sum[i].len=1;
            memset(sum[i].s,0,sizeof(sum[i].s));
        }
        a.len=1;
        b.s[1]=2    ;
        sum[1].s[1]=2;
        sum[2].s[1]=1;
        b.len=1;
        int pos=2;
        if(n>2)
        {    
                for(int i=1;i<n;i++)
                {
                      plusk(a,b,c);
                      copy(sum[pos],c);
                      int pos2;
                      pos2=pos+1;
                      copy(a,b);
                      copy(b,c);
                      pos++;
                  }
        }
        while(cin>>n)
        {
           print(sum[n]);
         }
         return 0;
}



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章
最新文章
相关文章