• 高精度模板


      1 #include <cstdio>
      2 #include <iostream>
      3 #include <algorithm>
      4 #include <ctime>
      5 #include <cstring>
      6 using namespace std;
      7 #define maxsize 1005
      8 //建立一个结构体
      9 struct hp
     10 {
     11     int len;//用来存储转化为整型后的长度
     12     int s[maxsize+1];//用来存储每一位
     13 };
     14 //copy  函数把b  copy给a
     15 void copy(hp &a,hp &b)
     16 {
     17     a.len=b.len;
     18     for(int i=1;i<=b.len;i++)
     19         a.s[i]=b.s[i];
     20 }
     21 //输入函数
     22 void input(hp &a,string str)
     23 {
     24     int i;
     25     while(str[0]=='0' && str.size()!=1)
     26         str.erase(0,1);//删除第一个元素
     27     a.len=(int)str.size();//把str的长度复制给a的len
     28     for(i=1;i<=a.len;++i)
     29         a.s[i]=str[a.len-i]-48;//a数组存储每一位,并且字符要逆向存入数组
     30     for (i=a.len+1;i<=maxsize;++i)
     31         a.s[i]=0;//剩下的为0
     32 }
     33 //输出函数
     34 void print(const hp &y)
     35 {
     36     int i;
     37     for(i=y.len;i>=1;i--)//注意输出是要后面向前输出i=y.len
     38         printf("%d",y.s[i]);
     39     cout<<endl;
     40 }
     41 
     42 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     43 1 高精度加法
     44 void plusk(const hp &a,const hp &b,hp &c)
     45 {
     46     int i,len;
     47     for(i=1;i<=maxsize;i++)
     48             c.s[i]=0;//初始化数组可以用memset
     49     //len为两者中的最大值
     50     if(a.len>b.len)
     51            len=a.len;
     52     else
     53           len=b.len;
     54     //计算
     55     for(i=1;i<=len;i++)
     56     {
     57         c.s[i]+=a.s[i]+b.s[i];//注意这里是c.s[i]+=a.s[i]+b.s[i]
     58         if(c.s[i]>=10)//考虑进位思想
     59         {
     60             c.s[i]-=10;
     61             c.s[i+1]++;
     62         }
     63     }
     64     if(c.s[len+1]>0) //最后一位有进位情况
     65          len++;
     66     c.len=len;
     67 }
     68 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     69 2 高精度减法
     70 void subtract(const hp &a,const hp &b,hp &c)
     71 {
     72     int i,len;
     73     for(i=1;i<=maxsize;i++)
     74           c.s[i]=0;//初始化为0
     75     //求最大的长度
     76     if(a.len>b.len)
     77           len=a.len;
     78     else
     79          len=b.len;
     80     //减法计算
     81     for(i=1;i<=len;i++)
     82     {
     83         c.s[i]+=a.s[i]-b.s[i];//这个地方注意c.s[i]+=a.s[i]-b.s[i]
     84         if(c.s[i]<0)//如果小于0则要向前借位
     85         {
     86             c.s[i]+=10;//这里对应加10
     87             c.s[i+1]--;//前一位减1
     88         }
     89     }
     90     while(len>1&&c.s[len]==0)
     91            len--;//舍去前面的0
     92     c.len=len;
     93 }
     94 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     95 3 高精度比较
     96 int compare(const hp &a,const hp &b)
     97 {
     98     int len;
     99     //求最大的长度
    100     if(a.len>b.len)
    101         len=a.len;
    102     else
    103         len=b.len;
    104     while(len>0 && a.s[len]==b.s[len])
    105         len--;
    106     if(len==0) //如果两个相等
    107         return 0;
    108     else
    109         return a.s[len]-b.s[len];//a.s[len]-b.s[len]如果是负数则说明a小于b,反之
    110 }
    111 
    112 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    113 4高精度*单精度
    114 void multiply(const hp &a,int b,hp &c)
    115 {
    116     int i,len;
    117     for(i=1;i<=maxsize;i++)
    118          c.s[i]=0;//初始化为0
    119     len=a.len;
    120     //计算乘法
    121     for(i=1;i<=len;i++)
    122     {
    123         c.s[i]+=a.s[i]*b;//把每一位乘上b存到结构体C里,这里是 c.s[i]+=a.s[i]*b
    124         //进位思想
    125         c.s[i+1]+=c.s[i]/10;
    126         c.s[i]%=10;
    127     }
    128     //处理进位
    129     len++;
    130     while(c.s[len]>=10)
    131     {
    132         //进位运算
    133         c.s[len+1]+=c.s[len]/10;
    134         c.s[len]%=10;
    135         len++;
    136     }
    137     while(len>1&&c.s[len]==0)
    138           len--;//舍去前面没用的0
    139     c.len=len;
    140 }
    141 
    142 
    143 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    144 5高精度*高精度
    145 void multiplyh(const hp &a,const hp &b,hp &c)
    146 {
    147     int i,j,len;
    148     for(i=1;i<=maxsize;i++)
    149          c.s[i]=0;//初始化为0
    150     //计算
    151     for(i=1;i<=a.len;i++)
    152         for(j=1;j<=b.len;j++)
    153         {
    154             c.s[i+j-1]+=a.s[i]*b.s[j];//注意这里的计算
    155             c.s[i+j]+=c.s[i+j-1]/10;
    156             c.s[i+j-1]%=10;
    157         }
    158     ////////////////////////////
    159     len=a.len+b.len+1;
    160     while(len>1&&c.s[len]==0)
    161            len--;//舍去前面没用的0
    162     c.len=len;
    163 }
    164 
    165 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    166 6高精度/单精度  {d为余数}
    167 void divide(const hp &a,int b,hp &c,int &d)   
    168 {
    169     int i,len;
    170     for(i=1;i<=maxsize;i++)
    171          c.s[i]=0;//初始化为0
    172     len=a.len;
    173     d=0;
    174     //注意除法的计算要从高位向下除
    175     for(i=len;i>=1;i--)
    176     {
    177         d=d*10+a.s[i];//计算
    178         c.s[i]=d/b;//存入c中
    179         d%=b;//d为于数
    180     }
    181     ////////////////////////////////
    182     while(len>1&&c.s[len]==0)
    183         len--;//舍去前面没用的0
    184     c.len=len;
    185 }
    186 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    187 7 高精度*10
    188 void multiply10(hp &a)    
    189 {
    190     int i;
    191     //乘上10就是每一位都向前移动,而s[1]=0;
    192     for(i=a.len;i>=1;i--)
    193         a.s[i+1]=a.s[i];
    194     a.s[1]=0;
    195     //////////////////////
    196     a.len++;
    197     while(a.len>1&&a.s[a.len]==0)
    198         a.len--;//舍去前面没用的0
    199 }
    200 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    201 8   高精度/高精度  {d为余数}
    202 void divideh(const hp &a,const hp &b,hp &c,hp &d)  
    203 {
    204     hp e;
    205     int i,len;
    206     //初始化
    207     for(i=1;i<=maxsize;i++)
    208     {
    209         c.s[i]=0;
    210         d.s[i]=0;
    211     }
    212     ////////////////////////////
    213     len=a.len;
    214     d.len=1;
    215     for(i=len;i>=1;i--)
    216     {
    217         multiply10(d);//高进度乘上10
    218         d.s[1]=a.s[i];
    219         while(compare(d,b)>=0)
    220         {
    221             subtract(d,b,e);
    222             d=e;
    223             c.s[i]++;
    224         }
    225     }
    226     while(len>1&&c.s[len]==0)
    227           len--;//舍去前面没用的0
    228     c.len=len;
    229 }
    230 ///////////////////////////////////////////////////////////////////
    231 hp sum[1003];//创建一个结构体数组
    232 int main()
    233 {
    234             int n=1002;
    235         hp a, b,c,tmp;
    236         c.len=0;
    237         a.s[1]=1;
    238         for(int i=2;i<1002;i++)
    239         {
    240                      b.s[i]=0;    
    241                      a.s[i]=0;
    242                  }
    243         for(int i=0;i<1002;i++)
    244         {
    245             sum[i].len=1;
    246             memset(sum[i].s,0,sizeof(sum[i].s));
    247         }
    248         a.len=1;
    249         b.s[1]=2    ;
    250         sum[1].s[1]=2;
    251         sum[2].s[1]=1;
    252         b.len=1;
    253         int pos=2;
    254         if(n>2)
    255         {    
    256                    for(int i=1;i<n;i++)
    257                   {
    258                         plusk(a,b,c);
    259                             copy(sum[pos],c);
    260                         int pos2;
    261                         pos2=pos+1;
    262                        copy(a,b);
    263                        copy(b,c);
    264                       pos++;
    265                   }
    266         }
    267            while(cin>>n)
    268            {
    269              print(sum[n]);
    270            }
    271               return 0;
    272 }

    原文链接:http://blog.csdn.net/cgl1079743846/article/details/7649244

  • 相关阅读:
    ps photoshop cc 2015 Extract Assets(生成器)切图大法
    获取免费代理推荐
    nodejs http代理请求
    nodejs 发起http请求
    AHK GUI开发示例
    为【桌面右键菜单
    NPM 模块收集
    nodejs Commander 命令行神器简单示例
    如何用nodejs 开发一个命令行交互工具
    利用 T-sql 的从句 for xml path('') 实现多行合并到一行, 并带有分隔符
  • 原文地址:https://www.cnblogs.com/10jschen/p/2646081.html
Copyright © 2020-2023  润新知