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

本文详细介绍了C语言中数值的比较与运算方法,包括自定义比较函数、数值减法和除法运算,并通过实例展示了如何实现最大公约数计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<string.h>
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.num[i])
        {
            return 0;
        }
    }
    return -1;
}
BN jian(BN a,BN b)//a比b大
{
    BN tmp;
    tmp.len=0;
    int n;
    int flag=0;
    n=a.len;
    int i;
    for(i=1;i<=a.len;i++)
    {
        if(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<wei;j++)
            {
                printf("0");
            }
            printf("\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值