高精度GCD
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
void init(int num[]){
char s[10005]={0};
scanf("%s",s);
num[0]=strlen(s);
for(int i=1;i<=num[0];i++){
num[i]=s[num[0]-i]-'0';
}
}
void print(int num[]){
for(int i=num[0];i>=1;i--){
printf("%d",num[i]);
}
printf("
");
}
int A[10005],B[10005],C[10005]={1,1},f[10]={1,2};
int cmp(int a[],int b[]){
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>=1;i--){
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;
}
void jianfa(int a[],int b[]){
for(int i=1;i<=a[0];i++){
a[i]-=b[i];
if(a[i]<0){
a[i]+=10;
a[i+1]--;
}
}
a[0]++;//注意
for(int i=a[0];i>=1;i--){
if(!a[i]) a[0]=i;
else break;
}
if(a[0]>=2) a[0]--;
}
void chengfa(int a[],int b[]){
int num[10005]={0};
memset(num,0,4*10005);
for(int i=1;i<=a[0];i++){
for(int j=1;j<=b[0];j++){
num[i+j-1]+=a[i]*b[j];
}
}
for(int i=1;i<=a[0]+b[0];i++){
if(num[i]>=10){
num[i+1]+=num[i]/10;
num[i]%=10;
}
}
num[0]=a[0]+b[0]+1;//注意
for(int i=a[0]+b[0];i>=2;i--){
if(!num[i]) num[0]=i;
else break;
}
num[0]--;
memset(a,0,sizeof(0));
memcpy(a,num,4*num[0]+4);
}
void chu2(int num[]){
for(int i=num[0];i>=1;i--){
if(num[i]&1&&i>=2) num[i-1]+=10;
num[i]/=2;
if(i==num[0]&&num[i]==0&&num[0]!=1) num[0]--;//注意
}
}
void gcd(int a[],int b[],int c[]){
if(cmp(a,b)<0){
swap(a,b);
}
while(!(b[0]==1&&b[1]==0)){
if((b[1]&1)&&(a[1]&1)){
jianfa(a,b);
}
else if(!(b[1]&1)&&(a[1]&1)){
chu2(b);
}
else if((b[1]&1)&&!(a[1]&1)){
chu2(a);
}
else if(!(b[1]&1)&&!(a[1]&1)){
chu2(a);chu2(b);
chengfa(c,f);
}
if(cmp(a,b)<0){
swap(a,b);
}
}
chengfa(c,a);
}
int main(){
freopen("in.txt","r",stdin);
init(A);init(B);
gcd(A,B,C);
print(C);
fclose(stdin);
return 0;
}