高精度模板

来源:互联网 发布:js 将时分秒转换成数字 编辑:程序博客网 时间:2024/06/08 07:07

高精度GCD

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>using namespace std;void init(int num[]){    char s[10005]={0};    scanf("%s",s);    num[0]=strlen(s);    for(int i=1;i<=num[0];i++){        num[i]=s[num[0]-i]-'0';    }}void print(int num[]){    for(int i=num[0];i>=1;i--){        printf("%d",num[i]);    }    printf("\n");}int A[10005],B[10005],C[10005]={1,1},f[10]={1,2};int cmp(int a[],int b[]){    if(a[0]>b[0]) return 1;    if(a[0]<b[0]) return -1;    for(int i=a[0];i>=1;i--){        if(a[i]>b[i]) return 1;        if(a[i]<b[i]) return -1;    }    return 0;}void jianfa(int a[],int b[]){    for(int i=1;i<=a[0];i++){        a[i]-=b[i];        if(a[i]<0){            a[i]+=10;            a[i+1]--;        }    }    a[0]++;//注意    for(int i=a[0];i>=1;i--){        if(!a[i]) a[0]=i;        else break;    }    if(a[0]>=2) a[0]--;}void chengfa(int a[],int b[]){    int num[10005]={0};    memset(num,0,4*10005);    for(int i=1;i<=a[0];i++){        for(int j=1;j<=b[0];j++){            num[i+j-1]+=a[i]*b[j];        }    }    for(int i=1;i<=a[0]+b[0];i++){        if(num[i]>=10){            num[i+1]+=num[i]/10;            num[i]%=10;        }    }    num[0]=a[0]+b[0]+1;//注意    for(int i=a[0]+b[0];i>=2;i--){        if(!num[i]) num[0]=i;        else break;    }    num[0]--;    memset(a,0,sizeof(0));    memcpy(a,num,4*num[0]+4);}void chu2(int num[]){    for(int i=num[0];i>=1;i--){        if(num[i]&1&&i>=2) num[i-1]+=10;        num[i]/=2;        if(i==num[0]&&num[i]==0&&num[0]!=1) num[0]--;//注意    }}void gcd(int a[],int b[],int c[]){      if(cmp(a,b)<0){        swap(a,b);    }    while(!(b[0]==1&&b[1]==0)){        if((b[1]&1)&&(a[1]&1)){            jianfa(a,b);        }        else if(!(b[1]&1)&&(a[1]&1)){            chu2(b);        }        else if((b[1]&1)&&!(a[1]&1)){            chu2(a);        }        else if(!(b[1]&1)&&!(a[1]&1)){            chu2(a);chu2(b);            chengfa(c,f);        }        if(cmp(a,b)<0){            swap(a,b);        }    }    chengfa(c,a);}int main(){    freopen("in.txt","r",stdin);    init(A);init(B);    gcd(A,B,C);    print(C);    fclose(stdin);    return 0;}
原创粉丝点击