码迷,mamicode.com
首页 > 编程语言 > 详细

CRJ巨佬的gjd算法模板

时间:2017-11-10 10:52:07      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:cin   比较   names   als   size   col   赋值运算   ++   运算   

数组高精度

 

定义:

int N[20000], len, flag;
bignum() {
  memset(N,0,sizeof(N));
  len = 0;
  flag = 1;
}  

 

赋值运算:

void operator =(long long a) {
  int i=0;
  while(a!=0) {
     N[i]=a%10;
     a/=10;
     i++;
  }
  len=i;
}
void operator = (string g) { for(int i=0;i<g.size();i++) N[i]=g[g.size()-1-i]-48; len=g.size();
}

 

输出:

void pt()
{
    if(flag==0) printf("-");
    for(int i=len;i>=0;i--) printf("%d",N[i]);
}

 

 

三则运算:

    friend bignum operator + (bignum f,bignum g)
    {
        bignum ans;
        ans.len=max(f.len,g.len)+1;
        int tp=0;
        for(int i=0;i<=ans.len;i++)
        {
            ans.N[i]=f.N[i]+g.N[i]+tp;
            tp=ans.N[i]/10;
            ans.N[i]%=10;
        }
        int i=ans.len;
        while(ans.N[i]==0&&i>0)
        {
            ans.len--;
            i--;    
        } 
        return ans;
    }
    
    friend bignum operator * (bignum f,bignum g)
    {
        bignum ans;
        ans.len=f.len+g.len;
        int tp=0;
        for(int i=0;i<f.len;i++)
        {
            for(int j=0;j<g.len;j++)
            {
                ans.N[i+j]+=f.N[i]*g.N[j];
                ans.N[i+j+1]+=ans.N[i+j]/10;
                ans.N[i+j]%=10;
            }
        }
        int i=ans.len;
        while(ans.N[i]==0&&i>0)
        {
            ans.len--;
            i--;    
        } 
        return ans;
    }
    
    friend bignum operator - (bignum f,bignum g)
    {
        bignum ans;
        if(f<g) 
        {
            swap(f,g);
            ans.flag=0;
        }
        
        ans.len=max(f.len,g.len);
        for(int i=0;i<f.len;i++)
        {
            ans.N[i]=f.N[i]-g.N[i];
            if(ans.N[i]<0) 
            {
                f.N[i+1]--;
                ans.N[i]+=10;    
            }
        }
        int i=ans.len;
        while(ans.N[i]==0&&i>0)
        {
            ans.len--;
            i--;    
        } 
        return ans;
    }

比较运算:

    friend bool operator < (bignum f,bignum g)
    {
        if(f.len<g.len) return true;
        else if(f.len==g.len)
        {
            bool flg=1;
            for(int i=0;i<g.len;i++)if(f.N[i]<g.N[i])    return true;
            return false;
        } else return false;
    }

 

完整代码:

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 using namespace std;
  6 
  7 struct bignum
  8 {
  9     int N[20000],len,flag;
 10     
 11     bignum()
 12     {
 13         memset(N,0,sizeof(N));
 14         len=0;
 15         flag=1;
 16     }    
 17     
 18     void operator =(long long a)
 19   {
 20       int i=0;
 21       while(a!=0)
 22       {
 23            N[i]=a%10;
 24            a/=10;
 25            i++;
 26        }
 27        len=i;
 28   }
 29   
 30     void operator = (string g)
 31     {
 32         for(int i=0;i<g.size();i++)    N[i]=g[g.size()-1-i]-48;
 33         len=g.size();
 34     }
 35     
 36     friend bignum operator + (bignum f,bignum g)
 37     {
 38         bignum ans;
 39         ans.len=max(f.len,g.len)+1;
 40         int tp=0;
 41         for(int i=0;i<=ans.len;i++)
 42         {
 43             ans.N[i]=f.N[i]+g.N[i]+tp;
 44             tp=ans.N[i]/10;
 45             ans.N[i]%=10;
 46         }
 47         int i=ans.len;
 48         while(ans.N[i]==0&&i>0)
 49         {
 50             ans.len--;
 51             i--;    
 52         } 
 53         return ans;
 54     }
 55     
 56     friend bignum operator * (bignum f,bignum g)
 57     {
 58         bignum ans;
 59         ans.len=f.len+g.len;
 60         int tp=0;
 61         for(int i=0;i<f.len;i++)
 62         {
 63             for(int j=0;j<g.len;j++)
 64             {
 65                 ans.N[i+j]+=f.N[i]*g.N[j];
 66                 ans.N[i+j+1]+=ans.N[i+j]/10;
 67                 ans.N[i+j]%=10;
 68             }
 69         }
 70         int i=ans.len;
 71         while(ans.N[i]==0&&i>0)
 72         {
 73             ans.len--;
 74             i--;    
 75         } 
 76         return ans;
 77     }
 78     
 79     friend bignum operator - (bignum f,bignum g)
 80     {
 81         bignum ans;
 82         if(f<g) 
 83         {
 84             swap(f,g);
 85             ans.flag=0;
 86         }
 87         
 88         ans.len=max(f.len,g.len);
 89         for(int i=0;i<f.len;i++)
 90         {
 91             ans.N[i]=f.N[i]-g.N[i];
 92             if(ans.N[i]<0) 
 93             {
 94                 f.N[i+1]--;
 95                 ans.N[i]+=10;    
 96             }
 97         }
 98         int i=ans.len;
 99         while(ans.N[i]==0&&i>0)
100         {
101             ans.len--;
102             i--;    
103         } 
104         return ans;
105     }
106     
107     friend bool operator < (bignum f,bignum g)
108     {
109         if(f.len<g.len) return true;
110         else if(f.len==g.len)
111         {
112             bool flg=1;
113             for(int i=0;i<g.len;i++)if(f.N[i]<g.N[i])    return true;
114             return false;
115         } else return false;
116     }
117     
118     void pt()
119     {
120         if(flag==0) printf("-");
121         for(int i=len;i>=0;i--) printf("%d",N[i]);
122     }
123 };
124 
125 int main() {
126   bignum A,B;
127     long long a,b;
128     cin>>a>>b;    
129     A=a;
130     B=b;
131     bignum ans;
132     ans=A-B;
133     ans.pt();
134     return 0;
135 }

 

CRJ巨佬的gjd算法模板

标签:cin   比较   names   als   size   col   赋值运算   ++   运算   

原文地址:http://www.cnblogs.com/frankscode/p/7813099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!