• 高精度 模板 压代码 精简版


     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 struct bign{
     6     int len;
     7     int num[1501];
     8     bool flag;
     9     bign(){len=1;flag=0;memset(num,0,sizeof num);}
    10     bign(int x){
    11         if(!x)return;
    12         len=0;
    13         while(x)num[++len]=x%10;x/=10;
    14     }
    15 };
    16 bool operator < (bign a,bign b){
    17     if(a.len<b.len)return 1;
    18     if(a.len>b.len)return 0;
    19     for(int i=a.len;i>=1;i--)if(a.num[i]>b.num[i])return 0;
    20     return 1;
    21 }
    22 bool operator == (bign a,bign b){
    23     if(a.len!=b.len)return 0;
    24     for(int i=1;i<=a.len;i++)if(a.num[i]!=b.num[i])return 0;
    25     return 1;
    26 }
    27 bign operator + (bign a,bign b){
    28     bign ans;
    29     int i=1,x=0;
    30     while(i<=a.len || i<=b.len){
    31         ans.num[i]+=x;ans.num[i]+=(a.num[i]+b.num[i]);
    32         x=ans.num[i]/10;ans.num[i]%=10;  i++;
    33     }
    34     ans.num[i]=x;
    35     if(!ans.num[i])i--;
    36     ans.len=i;
    37     return ans;
    38 }
    39 bign operator * (bign a,bign b){
    40     bign ans;
    41     int len=a.len+b.len;
    42     for(int i=1;i<=a.len;i++){
    43         int x=0;
    44         for(int j=1;j<=b.len;j++){
    45             ans.num[i+j-1]+=(a.num[i]*b.num[j]+x);
    46             x=ans.num[i+j-1]/10;
    47             ans.num[i+j-1]%=10;
    48         }
    49         ans.num[i+b.len]+=x;
    50     }
    51     while(!ans.num[len] && len>1)len--;
    52     ans.len=len;
    53     return ans;
    54 }
    55 bign operator - (bign a,bign b){
    56     bign ans;
    57     if(a==b)return ans;
    58     if(b<a){
    59         for(int i=1;i<=a.len;i++){
    60             if(a.num[i]<0)a.num[i]+=10,a.num[i+1]--;
    61             ans.num[i]=a.num[i]-b.num[i];
    62             if(ans.num[i]<0){
    63                 ans.num[i]+=10; a.num[i+1]--;//向a的高位借位
    64             }
    65         }
    66     }
    67     else{
    68         ans.flag=1;// this number(I mean the ans) is smaller than zero
    69         for(int i=1;i<=b.len;i++){
    70             if(b.num[i]<0){
    71                 b.num[i]+=10; b.num[i+1]--;
    72             }
    73             ans.num[i]=b.num[i]-a.num[i];
    74             if(ans.num[i]<0){
    75                 ans.num[i]+=10; b.num[i+1]--;
    76             }
    77         }
    78     }
    79     int len=max(a.len,b.len);
    80     while(ans.num[len]<=0 && len>1)len--;
    81     ans.len=len;
    82     return ans;
    83 }
  • 相关阅读:
    关于xcode中证书安装问题
    iOSOpenDev 安装流程
    openCV
    POJ2081(Recaman's Sequence)
    POJ1163(The Triangle)
    POJ3620(Avoid The Lakes)
    POJ1160(Post Office)
    POJ3177(Redundant Paths) or POJ3352(Road Construction)
    POJ1953(World Cup Noise)
    POJ1904(King's Quest)
  • 原文地址:https://www.cnblogs.com/Skyvot/p/4072676.html
Copyright © 2020-2023  润新知