zoukankan      html  css  js  c++  java
  • 完全大数(高精度)模版

    注意这个是在网上收集的,减法有一个地方有错误,我已经修正,下面是修正后的大数模板

    这个模板不支持负数

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <algorithm>
      4 #include <string.h> 
      5 using namespace std; 
      6 /* 
      7 * 完全大数模板  
      8 * 输入cin>>a 
      9 * 输出a.print();  
     10 * 注意这个输入不能自动去掉前导0的,可以先读入到char数组,去掉前导0,再用构造函数。 
     11 */ 
     12 #define MAXN 9999
     13 #define MAXSIZE 1010 //输入输出的长度
     14 #define DLEN 4  
     15 class BigNum {
     16 private:     int a[500];  //可以控制大数的位数   
     17              int len; 
     18 public:    
     19                  BigNum()
     20                  {len=1;memset(a,0,sizeof(a));}  //构造函数    
     21                  BigNum(const int);     //将一个int类型的变量转化成大数   
     22                  BigNum(const char*);   //将一个字符串类型的变量转化为大数    
     23                  BigNum(const BigNum &); //拷贝构造函数    
     24                  BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算   
     25                  friend istream& operator>>(istream&,BigNum&); //重载输入运算符  
     26                  friend ostream& operator<<(ostream&,BigNum&); //重载输出运算符  
     27              BigNum operator+(const BigNum &)const;  //重载加法运算符,两个大数之间的相加运算    
     28              BigNum operator-(const BigNum &)const;  //重载减法运算符,两个大数之间的相减运算    
     29              BigNum operator*(const BigNum &)const;  //重载乘法运算符,两个大数之间的相乘运算    
     30              BigNum operator/(const int &)const;     //重载除法运算符,大数对一个整数进行相除 运算  
     31              BigNum operator^(const int &)const;     //大数的n次方运算 
     32                  int operator%(const int &)const;        //大数对一个int类型的变量进行取模运算    
     33                  bool operator>(const BigNum &T)const;   //大数和另一个大数的大小比较   
     34                  bool operator>(const int &t)const;      //大数和一个int类型的变量的大小比较  
     35              void print();        //输出大数 
     36 };
     37 BigNum::BigNum(const int b)   //将一个int类型的变量转化为大数
     38 {     int c,d=b;  
     39     len=0;   
     40     memset(a,0,sizeof(a));    
     41     while(d>MAXN)   
     42     {      
     43         c=d-(d/(MAXN+1))*(MAXN+1);     
     44         d=d/(MAXN+1);      
     45         a[len++]=c;    
     46     }     a[len++]=d; 
     47 }
     48 BigNum::BigNum(const char *s)  //将一个字符串类型的变量转化为大数 
     49 {    
     50     int t,k,index,L,i;  
     51     memset(a,0,sizeof(a));   
     52     L=strlen(s); 
     53     len=L/DLEN;    
     54     if(L%DLEN)len++;   
     55     index=0;   
     56     for(i=L-1;i>=0;i-=DLEN)   
     57     {       
     58         t=0;     
     59         k=i-DLEN+1;      
     60         if(k<0)k=0;      
     61         for(int j=k;j<=i;j++)      
     62             t=t*10+s[j]-'0';       
     63         a[index++]=t;  
     64     }
     65 } 
     66 BigNum::BigNum(const BigNum &T):len(T.len)  //拷贝构造函数
     67 {    
     68     int i;    
     69     memset(a,0,sizeof(a));   
     70     for(i=0;i<len;i++)    
     71         a[i]=T.a[i];
     72 }
     73 BigNum & BigNum::operator=(const BigNum &n)  //重载赋值运算符,大数之间赋值运算
     74 {   
     75     int i;   
     76     len=n.len;    
     77     memset(a,0,sizeof(a));   
     78     for(i=0;i<len;i++)     
     79         a[i]=n.a[i];  
     80     return *this; 
     81 } 
     82 istream& operator>>(istream &in,BigNum &b)
     83 {   
     84     char ch[MAXSIZE*4];   
     85     int i=-1;   
     86     in>>ch; 
     87      int L = strlen(ch); 
     88      int count = 0, sum = 0;  
     89      for (i = L - 1; i >= 0;)
     90      { 
     91          sum = 0;        
     92          int t = 1;    
     93          for (int j = 0; j<4 && i >= 0; j++, i--, t *= 10)
     94          {
     95              sum += (ch[i] - '0')*t;
     96          }       
     97          b.a[count] = sum;      
     98          count++;
     99      }    
    100      b.len = count++;    
    101      return in;
    102 } 
    103 ostream& operator<<(ostream& out, BigNum& b)  //重载输出运算符
    104 {    
    105     int i;    
    106     cout<<b.a[b.len-1];    
    107     for(i=b.len-2;i>=0;i--)  
    108     {       
    109         printf("%04d",b.a[i]); 
    110     }    
    111     return out; 
    112 } 
    113 BigNum BigNum::operator+(const BigNum &T)const   //两个大数之间的相加运算
    114 {    
    115     BigNum t(*this);   
    116     int i,big;  
    117     big=T.len>len?T.len:len;     
    118     for(i=0;i<big;i++) 
    119     {      
    120         t.a[i]+=T.a[i];  
    121         if(t.a[i]>MAXN)   
    122         {         
    123             t.a[i+1]++;     
    124             t.a[i]-=MAXN+1;      
    125         }    
    126     }    
    127     if(t.a[big]!=0)    
    128         t.len=big+1;    
    129     else t.len=big;   
    130     return t; 
    131 }
    132 BigNum BigNum::operator-(const BigNum &T)const  //两个大数之间的相减运算
    133 {   
    134     int i,j,big;   
    135     bool flag;   
    136     BigNum t1,t2;  
    137     if(*this>T)   
    138     {       
    139         t1=*this;   
    140         t2=T;      
    141         flag=0;   
    142     }   
    143     else  
    144     { 
    145         t1 = T;     
    146         t2 = *this;       
    147         flag = 1;  
    148     }   
    149     big = t1.len;   
    150     for (i = 0; i<big; i++)
    151     { 
    152         if (t1.a[i]<t2.a[i]) 
    153         { 
    154             j = i + 1;    
    155             while (t1.a[j] == 0)   
    156                 j++;           
    157             t1.a[j--]--;      
    158             while (j>i)      
    159                 t1.a[j--] += MAXN;    
    160             t1.a[i] += MAXN + 1 - t2.a[i]; 
    161         }
    162         else
    163             t1.a[i] -= t2.a[i]; 
    164     }     t1.len = big;  
    165     while (t1.a[t1.len - 1] == 0 && t1.len>1)
    166     { 
    167         t1.len--;      
    168         big--;
    169     }     
    170     if (flag)   
    171         t1.a[big - 1] = 0 - t1.a[big - 1]; 
    172     return t1;
    173 } BigNum BigNum::operator*(const BigNum &T)const  //两个大数之间的相乘 
    174 {    
    175     BigNum ret;     
    176     int i,j,up;    
    177     int temp,temp1;  
    178     for(i=0;i<len;i++)   
    179     {      
    180         up=0;    
    181         for(j=0;j<T.len;j++)     
    182         {         
    183             temp=a[i]*T.a[j]+ret.a[i+j]+up;  
    184             if(temp>MAXN)         
    185             {               
    186                 temp1=temp-temp/(MAXN+1)*(MAXN+1);   
    187                 up=temp/(MAXN+1);      
    188                 ret.a[i+j]=temp1;       
    189             }         
    190             else       
    191             {            
    192                 up=0;         
    193                 ret.a[i+j]=temp;    
    194             }      
    195         }        
    196         if(up!=0)        
    197             ret.a[i+j]=up;  
    198     }   
    199     ret.len=i+j;  
    200     while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--;   
    201     return ret; 
    202 }
    203 BigNum BigNum::operator/(const int &b)const  //大数对一个整数进行相除运算
    204 {   
    205     BigNum ret;   
    206     int i,down=0;   
    207     for(i=len-1;i>=0;i--)  
    208     {        
    209         ret.a[i]=(a[i]+down*(MAXN+1))/b;   
    210         down=a[i]+down*(MAXN+1)-ret.a[i]*b;  
    211     }  
    212     ret.len=len; 
    213     while(ret.a[ret.len-1]==0 && ret.len>1)  
    214         ret.len--;    
    215     return ret;
    216 }
    217 int BigNum::operator%(const int &b)const   //大数对一个 int类型的变量进行取模
    218 {   
    219     int i,d=0;    
    220     for(i=len-1;i>=0;i--)     
    221         d=((d*(MAXN+1))%b+a[i])%b;   
    222     return d; 
    223 } 
    224 BigNum BigNum::operator^(const int &n)const  //大数的n次方运算
    225 {   
    226     BigNum t,ret(1); 
    227     int i;   
    228     if(n<0)exit(-1); 
    229     if(n==0)return 1;  
    230     if(n==1)return *this; 
    231     int m=n;   
    232     while(m>1)   
    233     {      
    234         t=*this;  
    235         for(i=1;(i<<1)<=m;i<<=1)    
    236             t=t*t;   
    237         m-=i;       
    238         ret=ret*t;      
    239         if(m==1)ret=ret*(*this);    
    240     }     
    241     return ret;
    242 } 
    243 bool BigNum::operator>(const BigNum &T)const    //大数和另一个大数的大小比较 
    244 {   
    245     int ln;   
    246     if(len>T.len)return true;  
    247     else if(len==T.len)   
    248     {      
    249         ln=len-1; 
    250         while(a[ln]==T.a[ln]&&ln>=0)        
    251             ln--;     
    252         if(ln>=0 && a[ln]>T.a[ln])      
    253             return true;     
    254         else       
    255             return false;    
    256     }   
    257     else   
    258         return false;
    259 } 
    260 bool BigNum::operator>(const int &t)const  //大数和一个int类型的变量的大小比较 
    261 {  
    262     BigNum b(t);  
    263     return *this>b;
    264 } 
    265 void BigNum::print()   //输出大数
    266 {    
    267     int i; 
    268     printf("%d",a[len-1]);   
    269     for(i=len-2;i>=0;i--)   
    270         printf("%04d",a[i]);   
    271     printf("
    "); 
    272 } BigNum f[110];//卡特兰数  
    273 int main()
    274 {
    275     f[0] = 1; 
    276     for (int i = 1; i <= 100; i++)  
    277         f[i] = f[i - 1] * (4 * i - 2) / (i + 1);//卡特兰数递推式 
    278     int n; 
    279     while(scanf("%d",&n)==1) 
    280     {  
    281         if(n==-1)break; 
    282         f[n].print(); 
    283     } 
    284     return 0; 
    285 }
    View Code
  • 相关阅读:
    《算法图解》——第六章 广度有限搜索
    《算法图解》——第一章 算法简介
    《算法图解》——第二章 选择排序
    go-json处理的问题
    Go断言
    Go Example--格式化字符串
    Go Example--strings
    Go Example--组合函数
    Go Example--defer
    Go Example--panic
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5696189.html
Copyright © 2011-2022 走看看