高精度模板

来源:互联网 发布:java等级 编辑:程序博客网 时间:2024/05/17 01:34
#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给avoid 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 高精度*10void 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;}

1 0
原创粉丝点击