题目大意:给出长宽用二进制表示的矩形,求分成正方形的最大边长为多少?
解题思路:再一次感觉自己弱了,开场非常好,连破两道,后边实在乏力,就这样最后一战也没打好,好好准备唯一的一场晋级赛吧!祭奠下第一次也是最后一次的网预赛了。算是体验了,人生也就完整了。回到这个题,简单推一下就知道是求这两个数的最大公约数。但是这里有有个限制,一个是用二进制数表示的,二是数据太大。因此这里要用大数模板来写,详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5050
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000+10;
int cas,t;
char str1[MAXN],str2[MAXN];
struct BigNumClass{
int len;
int val[MAXN];
};
bool cmp(BigNumClass bnc1,BigNumClass bnc2){
if(bnc1.len<bnc2.len) return 1;
if(bnc1.len>bnc2.len) return 0;
for(int i=bnc1.len-1;i>=0;i--){
if(bnc1.val[i]<bnc2.val[i]) return 1;
if(bnc1.val[i]>bnc2.val[i]) return 0;
}
return 0;
}
BigNumClass min(BigNumClass bnc1,BigNumClass bnc2){
BigNumClass ret;
int cou,tmp;
int i,j;
ret=bnc1;
for(cou=0,i=0;i<bnc2.len;i++){
tmp=ret.val[i]-cou-bnc2.val[i];
if(tmp>=0){
cou=0;
ret.val[i]=tmp;
}
else{
cou=1;
ret.val[i]=tmp+2;
}
}
for(;i<bnc1.len;i++){
tmp=ret.val[i]-cou;
if(tmp>=0){
cou=0;
ret.val[i]=tmp;
}
else{
cou=1;
ret.val[i]=tmp+2;
}
}
while(ret.len>=1 && !ret.val[ret.len-1])
ret.len--;
return ret;
}
BigNumClass gao(BigNumClass n){
BigNumClass ret;
ret.len=n.len-1;
for(int i=0;i<ret.len;i++)
ret.val[i]=n.val[i+1];
return ret;
}
void print(BigNumClass bnc1,BigNumClass bnc2,int cnt){
printf("Case #%d: ",++cas);
if(bnc2.len) for(long i=bnc2.len-1;i>=0;i--)
printf("%d",bnc2.val[i]);
else for(long i=bnc1.len-1;i>=0;i--)
printf("%d",bnc1.val[i]);
while(cnt--)
printf("0");
printf("\n");
}
int main(){
cas=0;
BigNumClass bnc1,bnc2;
scanf("%d",&t);
while(t--){
long cnt=0;
scanf("%s%s",str1,str2);
int lens1= strlen(str1);
int lens2=strlen(str2);
bnc1.len=lens1;
bnc2.len=lens2;
for(int i=0;i<lens1;++i)
bnc1.val[i]=str1[lens1-1-i]-'0';
for(int i=0;i<lens2;++i)
bnc2.val[i]=str2[lens2-1-i]-'0';
while(bnc1.len && bnc2.len){
if(bnc1.val[0]){
if(bnc2.val[0]){
if(cmp(bnc1,bnc2)) bnc2=min(bnc2,bnc1);
else bnc1=min(bnc1,bnc2);
}
else bnc2=gao(bnc2);
}
else{
if(bnc2.val[0]) bnc1=gao(bnc1);
else{
bnc1=gao(bnc1);
bnc2=gao(bnc2);
cnt++;
}
}
}
print(bnc1,bnc2,cnt);
}
return 0;
}