Alice and BobTime Limit: 1 Sec Memory Limit: 64 MB
Submit: 255 Solved: 43
Description
Alice is a beautiful and clever girl. Bob would like to play with Alice. One day, Alice got a very big rectangle and wanted to divide it into small square pieces. Now comes a problem: if all pieces of small squares are of the same size, how big could the squares be? To Alice, it's easy to solve the problem. However, she was very busy, so she asked Bob to help her. You know Alice is such a lovely girl and of course Bob won't refuse her request. But Bob is not so smart and he is especially weak in math. So he turns to you —a genius at programming. Alice will inform Bob the length and width of the big rectangle, and Bob have to tell her the longest length for the small square. All of these numbers are in their binary representations.
Input
The first line of the input is a positive integer. This is the number of the test cases followed. Each test case contains two integer L and W in their binary representation which tells you the length and width of the very big rectangle(0< L , W < 2^1000 ).There may be one or several spaces between these integers.
Output
The output of the program should consist of one line of output for each test case. The output of each test case only contains the longest length for the small squares in its binary representation. No any redundant spaces are needed.
Sample Input
2 100 1000 100 110
Sample Output
100 10
本来想用辗转相除法,但问大神后据说会超时,就用了辗转相减:
若a,b都是偶数,则gcd(a,b)=2*gcd(a/2,b/2);
若a是奇数,b是偶数,则gcd(a,b)=gcd(a,b/2);
若a,b都是奇数,则gcd(a,b)=gcd(a-b,b);
注意以上3条都要用到,单用第3条会超时。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 void mult(int p[],int x,int *len1) 5 { 6 int i,temp=0; 7 for(i=0;i<*len1;i++) 8 { 9 p[i]=p[i]*x+temp; 10 temp=p[i]/10; 11 p[i]%=10; 12 } 13 if(temp) 14 { 15 p[i]=temp; 16 (*len1)++; 17 } 18 } 19 20 void add(int p[],int q[],int *len1) 21 { 22 int i; 23 for(i=0;i<*len1;i++) 24 { 25 p[i]+=q[i]; 26 if(p[i]>9) 27 { 28 p[i]-=10; 29 p[i+1]++; 30 } 31 } 32 if(p[i]) 33 (*len1)++; 34 } 35 36 void diviT(int p[],int *len,int *rem) //'rem' is used for installing remainder 37 { 38 int m=0,i; 39 for(i=*len-1;i>=0;i--) 40 { 41 m=m*10+p[i]; 42 if(!(m/2)) 43 { 44 p[i]=0; 45 } 46 else 47 { 48 p[i]=m/2; 49 m=m%2; 50 } 51 } 52 for(i=*len-1;i>=0;i--) 53 if(p[i]) 54 { 55 *len=i+1; 56 break; 57 } 58 59 if(i<0) 60 *len=1; 61 *rem=m; 62 } 63 64 void SubStract(int p1[],int p2[],int *len1,int *len2) //辗转相减 65 { 66 int i,flag=0,len; 67 68 if(p1[0]%2==0) 69 { 70 len=*len1; 71 diviT(p1,&len,&i); 72 *len1=len; 73 } 74 if(p2[0]%2==0) 75 { 76 len=*len2; 77 diviT(p2,&len,&i); 78 *len2=len; 79 } 80 if(*len1>*len2) flag=1; 81 else if(*len1<*len2) flag=2; 82 else 83 for(i=*len1-1;i>=0;i--) 84 if(p1[i]>p2[i]) 85 { 86 flag=1; 87 break; 88 } 89 else if(p1[i]<p2[i]) 90 { 91 flag=2; 92 break; 93 } 94 if(flag==1) 95 { 96 for(i=(*len1)-1;i>=*len2;i--) 97 p2[i]=0; 98 99 for(i=0;i<*len1;i++) 100 { 101 p1[i]-=p2[i]; 102 if(p1[i]<0) 103 { 104 p1[i]+=10; 105 p1[i+1]--; 106 } 107 } 108 109 if(p1[i-1]==0) 110 (*len1)--; 111 SubStract(p1,p2,len1,len2); 112 } 113 else if(flag==2) 114 { 115 for(i=(*len2)-1;i>=*len1;i--) 116 p1[i]=0; 117 118 for(i=0;i<*len2;i++) 119 { 120 p2[i]-=p1[i]; 121 if(p2[i]<0) 122 { 123 p2[i]+=10; 124 p2[i+1]--; 125 } 126 } 127 128 if(p2[i-1]==0) 129 (*len2)--; 130 SubStract(p1,p2,len1,len2); 131 } 132 else 133 return; 134 } 135 136 int main() //transfer binary to dimcal ,convey double"长度,十进制的数组" 137 { 138 //freopen("a.txt","r",stdin); 139 int n,i,j; 140 char str1[1001]; 141 char str2[1001]; 142 int num_a[1000]; 143 int num_b[1000]; 144 int num_c[1000]; //两次出始化 145 int len1,len2; 146 147 scanf("%d",&n); 148 149 while(n--) 150 { 151 int mean=1,k=0; 152 scanf("%s",str1); 153 scanf("%s",str2); 154 155 len2=len1=1; 156 memset(num_a,0,sizeof(num_a)); 157 memset(num_b,0,sizeof(num_b)); 158 memset(num_c,0,sizeof(num_c)); 159 160 for(i=0;str1[i]!='