• 高精度相关模板.


      1 ```
      2 /*
      3 高精度加法.
      4 */
      5 #include<cstring>
      6 #include<cstdio>
      7 #include<iostream>
      8 #define MAXN 10001
      9 using namespace std;
     10 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
     11 char m[MAXN],n[MAXN];
     12 void slove()
     13 {
     14     l3=max(l1,l2);
     15     for(int i=1;i<=l3;i++)
     16     {
     17         c[i]+=a[i]+b[i];
     18         c[i+1]+=c[i]/10;
     19         c[i]%=10;
     20     }
     21     if(c[l3+1]) l3++;
     22     while(!c[l3]&&l3>1) l3--;
     23     for(int i=l3;i>=1;i--) printf("%d",c[i]);
     24 }
     25 int main()
     26 {
     27     freopen("add.in","r",stdin);
     28     freopen("add.out","w",stdout);
     29     scanf("%s",m+1);l1=strlen(m+1);
     30     scanf("%s",n+1);l2=strlen(n+1);
     31     for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
     32     for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
     33     slove();
     34     return 0;
     35 }
     36 ```
     37 
     38 ```
     39 /*
     40 高精度减法.
     41 */
     42 #include<cstring>
     43 #include<cstdio>
     44 #include<iostream>
     45 #define MAXN 10001
     46 using namespace std;
     47 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
     48 char m[MAXN],n[MAXN];
     49 void pre()
     50 {
     51     if(l1>l2) 
     52     {
     53         for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
     54         for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
     55     }
     56     else if(l1<l2){
     57         printf("-");
     58         for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
     59         for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
     60     }
     61     else if(strcmp(m+1,n+1)>=0)
     62     {
     63         for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
     64         for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
     65     }
     66     else {
     67         printf("-");
     68         for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
     69         for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
     70     }
     71 }
     72 void slove()
     73 {
     74     l3=max(l1,l2);
     75     for(int i=1;i<=l3;i++)
     76     {
     77         if(a[i]<b[i]) a[i+1]--,a[i]+=10;
     78         c[i]=a[i]-b[i];
     79     }
     80     while(!c[l3]&&l3>1) l3--;
     81     for(int i=l3;i>=1;i--) printf("%d",c[i]);
     82 }
     83 int main()
     84 {
     85     freopen("sub.in","r",stdin);
     86     freopen("sub.out","w",stdout);
     87     scanf("%s",m+1);l1=strlen(m+1);
     88     scanf("%s",n+1);l2=strlen(n+1);
     89     pre();
     90     slove();
     91     return 0;
     92 }
     93 ```
     94 
     95 ```
     96 /*
     97 高精度乘法.
     98 */
     99 #include<cstring>
    100 #include<cstdio>
    101 #include<iostream>
    102 #define MAXN 10001
    103 using namespace std;
    104 int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
    105 char m[MAXN],n[MAXN];
    106 void slove()
    107 {
    108     int x;
    109     l3=l1+l2;
    110     for(int i=1;i<=l1;i++)
    111     {
    112         int x=0;
    113         for(int j=1;j<=l2;j++)
    114         {
    115             c[i+j-1]+=a[i]*b[j];
    116             c[i+j]+=c[i+j-1]/10;
    117             x=c[i+j-1]/10;
    118             c[i+j-1]%=10;
    119         }
    120         c[i+l2]=x;
    121     }
    122     if(c[l3+1]) l3++;
    123     while(!c[l3]&&l3>1) l3--;
    124     for(int i=l3;i>=1;i--) printf("%d",c[i]);
    125 }
    126 int main()
    127 {
    128     freopen("mul.in","r",stdin);
    129     freopen("mul.out","w",stdout);
    130     scanf("%s",m+1);l1=strlen(m+1);
    131     scanf("%s",n+1);l2=strlen(n+1);
    132     for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
    133     for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    134     slove();
    135     return 0;
    136 }
    137 ```
    138 
    139 ```
    140 /*
    141 高精度除法.
    142 */
    143 #include<cstring>
    144 #include<cstdio>
    145 #include<iostream>
    146 #define MAXN 10001
    147 using namespace std;
    148 int a[MAXN],b[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3;
    149 char m[MAXN],n[MAXN];
    150 bool cmp()
    151 {
    152     if(tmp[0]>l1) return false;
    153     if(l1>tmp[0]) return true;
    154     for(int i=l1;i>=1;i--)
    155     {
    156         if(a[i]>tmp[i]) return true;
    157         if(a[i]<tmp[i]) return false;
    158     }
    159     return true;
    160 }
    161 bool cmp1()
    162 {
    163     for(int i=1;i<=l1;i++)
    164     {
    165         if(m[i]>n[i]) return true;
    166         if(m[i]<n[i]) return false;
    167     }
    168     return true;
    169 }
    170 void slovejian()
    171 {
    172     for(int i=1;i<=l1;i++)
    173     {
    174         if(a[i]<tmp[i]) a[i+1]--,a[i]+=10;
    175         a[i]-=tmp[i];
    176     }
    177     while(!a[l1]&&l1>1) l1--;
    178 }
    179 void slove()
    180 {
    181     l3=l1-l2+1;
    182     for(int i=l3;i>=1;i--)
    183     {
    184         memset(tmp,0,sizeof tmp);
    185         for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j];
    186         tmp[0]=l2+i-1;
    187         while(cmp()) c[i]++,slovejian();
    188     }
    189     while(!c[l3]&&l3>1) l3--;
    190     for(int i=l3;i>=1;i--) printf("%d",c[i]);
    191 }
    192 int main()
    193 {
    194     scanf("%s",m+1);l1=strlen(m+1);
    195     scanf("%s",n+1);l2=strlen(n+1);
    196     if(l1>l2)
    197     {
    198         for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
    199         for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    200     }
    201     else if(l1<l2)
    202     {
    203         for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
    204         for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
    205         int t;t=l1,l1=l2,l2=t;
    206     }
    207     else if(cmp1())
    208     {
    209         for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
    210         for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    211     }
    212     else 
    213     {
    214         for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
    215         for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
    216         int t;t=l1,l1=l2,l2=t;
    217     }
    218     slove();
    219     return 0;
    220 }
    221 ```
    222 ```
    223 /*
    224 高精度取模求余.
    225 */
    226 #include<cstring>
    227 #include<cstdio>
    228 #include<iostream>
    229 #define MAXN 10001
    230 using namespace std;
    231 int a[MAXN],b[MAXN],ans[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3;
    232 char m[MAXN],n[MAXN];
    233 bool cmp()
    234 {
    235     if(tmp[0]>l1) return false;
    236     if(l1>tmp[0]) return true;
    237     for(int i=l1;i>=1;i--)
    238     {
    239         if(a[i]>tmp[i]) return true;
    240         if(a[i]<tmp[i]) return false;
    241     }
    242     return true;
    243 }
    244 void slovejian()
    245 {
    246     for(int i=1;i<=l1;i++)
    247     {
    248         if(a[i]<tmp[i]) a[i+1]--,a[i]+=10;
    249         a[i]-=tmp[i];
    250     }
    251     while(!a[l1]&&l1>1) l1--;
    252 }
    253 void chu()
    254 {
    255     l3=l1-l2+1;
    256     for(int i=l3;i>=1;i--)
    257     {
    258         memset(tmp,0,sizeof tmp);
    259         for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j];
    260         tmp[0]=l2+i-1;
    261         while(cmp()) c[i]++,slovejian();
    262     }
    263 }
    264 void mul()
    265 {
    266     memset(tmp,0,sizeof tmp);
    267     tmp[0]=l2+l3;
    268     for(int i=1;i<=l2;i++)
    269     {
    270         int x=0;
    271         for(int j=1;j<=l3;j++)
    272         {
    273             tmp[i+j-1]+=b[i]*c[j];
    274             x=tmp[i+j-1]/10;
    275             tmp[i+j]+=tmp[i+j-1]/10;
    276             tmp[i+j-1]%=10;
    277         }
    278         tmp[i+l3]=x;
    279     }
    280     if(tmp[tmp[0]+1]) tmp[0]++;
    281     while(tmp[tmp[0]]&&tmp[0]>1) tmp[0]--;
    282 }
    283 void slove()
    284 {
    285     chu();mul();
    286     ans[0]=max(l2,l3);
    287     for(int i=1;i<=ans[0];i++)
    288     {
    289         if(ans[i]<tmp[i]) ans[i+1]--,ans[i]+=10;
    290         ans[i]-=tmp[i];
    291     }
    292     while(!ans[ans[0]]&&ans[0]>1) ans[0]--;
    293     for(int i=ans[0];i>=1;i--) printf("%d",ans[i]);
    294 }
    295 int main()
    296 {
    297     scanf("%s",m+1);l1=strlen(m+1);
    298     scanf("%s",n+1);l2=strlen(n+1);
    299     for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48,ans[i]=a[i];
    300     for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    301     slove();
    302     return 0;
    303 }
    304 ```
    305 ```
    306 /*
    307 高精度错排公式.
    308 f[n]=(n-1)(f[n-1]+f[n-2]).
    309 */
    310 #include<iostream>
    311 #include<cstring>
    312 #include<cstdio>
    313 #define MAXN 201
    314 #define MAXM 1001
    315 using namespace std;
    316 int f[MAXN][MAXM],n,tmp[MAXM],t[MAXM];
    317 int read()
    318 {
    319     int x=0,f=1;char ch=getchar();
    320     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    321     while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
    322     return x*f;
    323 }
    324 void slove(int x)
    325 {
    326     memset(t,0,sizeof t);
    327     while(x) t[++t[0]]=x%10,x/=10;return ;
    328 }
    329 void add(int c[],int a[],int b[])
    330 {
    331     c[0]=a[0]+b[0];
    332     for(int i=1;i<=c[0];i++)
    333     {
    334         c[i]+=a[i]+b[i];
    335         c[i+1]+=c[i]/10;
    336         c[i]%=10;
    337     }
    338     if(c[c[0]+1]) c[0]++;
    339     while(!c[c[0]]&&c[0]>1) c[0]--;
    340     return;
    341 }
    342 void mul(int c[],int a[],int b[])
    343 {
    344     c[0]=a[0]+b[0];
    345     for(int i=1;i<=a[0];i++)
    346     {
    347         int x=0;
    348         for(int j=1;j<=b[0];j++)
    349         {
    350             c[i+j-1]+=a[i]*b[j];
    351             c[i+j]+=c[i+j-1]/10;
    352             x=c[i+j-1]/10;
    353             c[i+j-1]%=10;
    354         }
    355         c[i+b[0]]=x;
    356     }
    357     while(!c[c[0]]&&c[0]>1) c[0]--;
    358     return;
    359 }
    360 int main()
    361 {
    362     n=read();
    363     if(n==0){printf("1");return 0;}
    364     f[1][0]=1,f[1][1]=0;
    365     f[2][0]=1,f[2][1]=1;
    366     for(int i=3;i<=n;i++)
    367     {
    368         memset(tmp,0,sizeof tmp);
    369         add(tmp,f[i-1],f[i-2]);
    370         slove(i-1);
    371         mul(f[i],t,tmp);
    372     }
    373     for(int i=f[n][0];i>=1;i--) printf("%d",f[n][i]);
    374     return 0;
    375 }
    376 ```
  • 相关阅读:
    汉诺塔
    破损的键盘
    解方程
    运输计划
    选学霸
    子集和的目标值
    棋盘染色2
    守卫者的挑战
    飞扬的小鸟
    攻克城堡
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6074029.html
Copyright © 2020-2023  润新知