高精度模板

高精度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("\n");
}
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;
}

posted @ 2017-11-20 21:14  Mr_Wolfram  阅读(228)  评论(0编辑  收藏  举报