【自用模板】高精度GCD(二进制)

#include
#include
struct BN
{
    int len;
    int num[1005];
};
int wei=0;
char str1[1005];
char str2[1005];
int cmp(BN a,BN b)//1:a>b;0:b>a;-1:a=b;
{
    if(a.len>b.len)
    {
        return 1;
    }
    else if(b.len>a.len)
    {
        return 0;
    }
    for(int i=a.len;i>0;i--)
    {
        if(a.num[i]>b.num[i])
        {
            return 1;
        }
        else if(a.num[i]b.len)
        {
            b.num[i]=0;
        }
        if(a.num[i]-b.num[i]<0)
        {
            a.num[i]+=2;
            a.num[i+1]-=1;
        }
        tmp.num[i]=a.num[i]-b.num[i];
    }
    for(i=n;i>0;i--)
    {
        if(flag==0&&tmp.num[i]!=0)
        {
            flag=1;
        }
        if(flag==1)
        {
            tmp.len++;
        }
    }
    return tmp;
}
BN chu2(BN a)
{
    int i;
    for(i=1;i<=a.len;i++)
    {
        a.num[i]=a.num[i+1];
    }
    a.num[a.len]=0;    
    a.len--;    
    return a;
}
BN gcd(BN a,BN b)
{
    while(a.len&&b.len)
    {
        if(a.num[1])
        {
            if(b.num[1])
            {
                if(cmp(a,b)==1)
                {
                    BN item=b;
                    b=jian(a,b);
                    a=item;
                }
                else if(cmp(a,b)==0)
                {
                    BN item=a;
                    a=jian(b,a);
                    b=item;
                }
                else
                {
                    return a;
                }
            }
            else
            {
                b=chu2(b);
            }
        }
        else
        {
            if(b.num[1])
            {
                a=chu2(a);
            }
            else
            {
                a=chu2(a);
                b=chu2(b);
                wei++;        
            }
        }
    }
}
int main()
{
    int t;
    BN a,b,ans;
    int j;
    while(scanf("%d",&t)!=EOF)
    {
        for(int cas=1;cas<=t;cas++)
        {
            for(int i=0;i<=1004;i++)
            {
                ans.num[i]=a.num[i]=b.num[i]=0;
            }
            wei=0;
            scanf("%s%s",str1+1,str2+1);
            int len1=strlen(str1+1);
            int len2=strlen(str2+1);
            for(j=1;j<=len1;j++)
            {
                a.num[len1-j+1]=str1[j]-'0';
            }
            a.len=len1;
            for(j=1;j<=len2;j++)
            {
                b.num[len2-j+1]=str2[j]-'0';
            }
            b.len=len2;
            ans=gcd(a,b);
            printf("Case #%d: ",cas);
            for(j=ans.len;j>0;j--)
            {
                printf("%d",ans.num[j]);
            }
            for(j=0;j

你可能感兴趣的:(模板)