hdu 5050——Divided Land

来源:互联网 发布:淘宝怎么买翻墙 编辑:程序博客网 时间:2024/06/05 02:46

题意:求两个二进制数的最大公约数

竟然会出原题。。。直接把这篇博客里代码交上去就过了http://www.cnblogs.com/pcoda/archive/2011/05/04/2104588.html

代码如下:

#include <cstdio>#include <cstring>#include<iostream>using namespace std;const int MAXN=1005;struct BigNumber{   int len;   int v[MAXN];};bool isSmaller(BigNumber n1,BigNumber n2){ if(n1.len<n2.len)  return 1; if(n1.len>n2.len)  return 0; for(int i=n1.len-1;i>=0;i--) {  if(n1.v[i]<n2.v[i])   return 1;  if(n1.v[i]>n2.v[i])   return 0; } return 0;}BigNumber MMM(BigNumber n1,BigNumber n2){ BigNumber ret; int borrow,i,temp; ret=n1; for(borrow=0,i=0;i<n2.len;i++) {  temp=ret.v[i]-borrow-n2.v[i];  if(temp>=0)  {   borrow=0;   ret.v[i]=temp;  }  else  {   borrow=1;   ret.v[i]=temp+2;  } } for(;i<n1.len;i++) {  temp=ret.v[i]-borrow;  if(temp>=0)  {   borrow=0;   ret.v[i]=temp;  }  else  {   borrow=1;   ret.v[i]=temp+2;  } } while(ret.len>=1 && !ret.v[ret.len-1])  ret.len--; return ret;}BigNumber div2(BigNumber n){ BigNumber ret; ret.len=n.len-1; for(int i=0;i<ret.len;i++)  ret.v[i]=n.v[i+1]; return ret;}void gcd(BigNumber n1,BigNumber n2){ long b=0,i; while(n1.len && n2.len) {  if(n1.v[0])  {   if(n2.v[0])   {    if(isSmaller(n1,n2))     n2=MMM(n2,n1);    else     n1=MMM(n1,n2);   }   else    n2=div2(n2);  }  else  {   if(n2.v[0])    n1=div2(n1);   else   {    n1=div2(n1);    n2=div2(n2);    b++;   }  } } if(n2.len)  for(i=n2.len-1;i>=0;i--)   printf("%d",n2.v[i]); else  for(i=n1.len-1;i>=0;i--)   printf("%d",n1.v[i]); while(b--)  printf("0"); puts("");}int main(){//freopen("data.txt","r",stdin); int T,le,i; BigNumber n1,n2; char str1[MAXN],str2[MAXN]; scanf("%d",&T); int kase=0; while(T--) { printf("Case #%d: ",++kase);  scanf("%s%s",str1,str2);  le=strlen(str1);  n1.len=le;  for(i=0;i<le;i++)   n1.v[i]=str1[le-1-i]-'0';  le=strlen(str2);  n2.len=le;  for(i=0;i<le;i++)   n2.v[i]=str2[le-1-i]-'0';  gcd(n1,n2); } return 0;}


0 0
原创粉丝点击