• Zju2678 大数gcd


    画图推导,大数gcd,摘自网上的模板

    #include<stdio.h>

    #include<string.h>

    #define maxlen 1000+2 //数据的最大长度

    struct HP { int len, s[maxlen]; } ; //存储数据的结构

    char s1[maxlen],s2[maxlen];//存储输入的两个数据

    void PrintHP(HP x) //输出

    {

    for(int i=x.len;i>=1;i--)printf("%d",x.s[i]);

    printf("\n");

    }

    HP Str2HP(const char *s) //字符串转换成结构体数组,s数组中从1开始,并且从低位到高位

    {

    HP x; x.len=strlen(s);

    for(int i=1;i<=x.len;i++)

    x.s[i]=s[x.len-i]-'0';

    return x;

    }

     

    int IsSmaller(const HP x ,const HP y) //比较两个数据的大小,返回>=0的数,表示 y>=x;

    {

    if(x.len<y.len)return 1;

    if(x.len>y.len)return -1;

    int i=x.len ;

    while((i>1)&&(x.s[i]==y.s[i]))i--;

    return y.s[i]-x.s[i];

    }

     

    HP Subtract(const HP a ,const HP b) //相减

    {

    HP c; int i,j;

    for(i=1,j=0;i<=a.len;i++)

    {

    c.s[i]=a.s[i]-j;

    if(i<=b.len)c.s[i]-=b.s[i];

    if(c.s[i]<0)j=1,c.s[i]+=10;

    else j=0;

    }

    c.len=a.len;

    while(c.len>1&&!c.s[c.len])c.len--;

    return c;

    }

     

    HP div2(const HP a) //除以2

    {

    int i,c; HP ret;ret.len=a.len;

    for(c=0,i=a.len;i>=1;i--)

    {

    if((c*10+a.s[i])>=2)ret.s[i]=(c*10+a.s[i])/2,c=(c*10+a.s[i])%2;

    else ret.s[i]=0,c=c*10+a.s[i];

    }

    while(ret.s[ret.len]==0)ret.len--;

    return ret;

    }

     

    HP multi2(HP a) //乘以2

    {

    int i,c; HP ret; ret.len=a.len;

    for(i=1,c=0;i<=a.len;i++)

    {

    ret.s[i]=(a.s[i]*2+c)%10;

    c=(a.s[i]*2+c)/10;

    }

    if(c>0)ret.s[++ret.len]=c;

    return ret;

    }

    HP stein(HP a,HP b)//返回一个结构体的最大公约数

    {

    int num=0;

    while(a.len&&b.len)

    {

    if(a.s[1]%2)

    {

    if(b.s[1]%2)

    {

    if(IsSmaller(a,b)>=0)b=Subtract(b,a);

    else a=Subtract(a,b);

    }

    else b=div2(b);

    }

    else

    {

    if(b.s[1]%2)a=div2(a);

    else a=div2(a),b=div2(b),num++;

    }

    if(a.len==1&&a.s[1]==0) break;

    if(b.len==1&&b.s[1]==0) break;

    }

    if(a.len)

    {

    while(num--)a=multi2(a);

    return a;

    }

    else

    {

    while(num--)b=multi2(b);

    return b;

    }

    }

    int main()

    {

    HP a,b;

    freopen("in.txt","r",stdin);

    bool flag=0;

    while(scanf("%s%s",s1,s2)!=EOF)

    {

     

    if(flag)

    printf("\n");

    flag=1;

    a=Str2HP(s1);

    b=Str2HP(s2);

    PrintHP(stein(a,b));

    }

     

    return 0;

    }

  • 相关阅读:
    python分布式爬虫-Selenium(针对需要渲染的页面)
    《PHP高性能开发:基础、框架与项目实战》_王甲临
    flutter hello world
    C#+EF+SQLite数据库操作
    【转】Wilcoxon 检验之 rank-sum 与 signed-rank
    [转]多目标进化算法的性能指标总结 (一)
    IDEA查找栏
    [转]IDEA空指针断点
    Java 高斯分布随机数
    【Vegas原创】centos中挖矿病毒kdevtmpfsi的终极解决方法
  • 原文地址:https://www.cnblogs.com/inpeace7/p/2391991.html
Copyright © 2020-2023  润新知