HDU 5050 二进制大数GCD

来源:互联网 发布:项目管理分析软件 编辑:程序博客网 时间:2024/06/10 10:20

两个二进制数的最大公约数,模板代码如下

#include<stdio.h>#include<string.h>#include<algorithm>#include<stdlib.h>#include<iostream>using namespace std;#define maxn 1010struct node{     int l;     int v[maxn];};bool issmaller(node x1,node x2){     if(x1.l<x2.l)          return 1;     if(x1.l>x2.l)          return 0;     for(int i=x1.l-1;i>=0;i--)     {          if(x1.v[i]<x2.v[i])               return 1;          if(x1.v[i]>x2.v[i])               return 0;     }     return 0;}node Minus(node x1,node x2){     node s;     int i,k,teamp;     s=x1;     for(k=0,i=0;i<x2.l;i++)     {          teamp=s.v[i]-k-x2.v[i];          if(teamp>=0)          {               k=0;               s.v[i]=teamp;          }          else          {               k=1;               s.v[i]=teamp+2;          }     }     for(;i<x1.l;i++)     {          teamp=s.v[i]-k;          if(teamp>=0)          {               k=0;               s.v[i]=teamp;          }          else          {               k=1;               s.v[i]=teamp+2;          }     }     while(s.l>=1&&!s.v[s.l-1])          s.l--;     return s;}node div2(node n){     node s;     s.l=n.l-1;     for(int i=0;i<s.l;i++)          s.v[i]=n.v[i+1];     return s;}void gcd(node x1,node x2,int k){     long long w=0,i;     while(x1.l&&x2.l)     {          if(x1.v[0])          {               if(x2.v[0])               {                    if(issmaller(x1,x2))                         x2=Minus(x2,x1);                    else                         x1=Minus(x1,x2);               }               else                    x2=div2(x2);          }          else          {               if(x2.v[0])                    x1=div2(x1);               else               {                    x1=div2(x1);                    x2=div2(x2);                    w++;               }          }     }     printf("Case #%d: ",k);     if(x2.l)     {          for(i=x2.l-1;i>=0;i--)               printf("%d",x2.v[i]);     }     else     {          for(i=x1.l-1;i>=0;i--)               printf("%d",x1.v[i]);     }     while(w--)          printf("0");     printf("\n");}int main(void){     int i,j,k,n,m,t,l;     node x1,x2;     char s1[maxn],s2[maxn];     scanf("%d",&t);     for(j=1;j<=t;j++)     {          scanf("%s%s",s1,s2);          l=strlen(s1);          x1.l=l;          for(i=0;i<l;i++)          {               x1.v[i]=s1[l-1-i]-'0';          }          l=strlen(s2);          x2.l=l;          for(i=0;i<l;i++)               x2.v[i]=s2[l-1-i]-'0';          gcd(x1,x2,j);     }     return 0;}

原创粉丝点击