• 高精度模板


    高精度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;
    }
    
    
  • 相关阅读:
    php排序算法-冒泡排序
    Mac安装java JDK
    mysql索引简单记录一下
    Mac 通过 pecl安装 redis 扩展
    Mac通过pecl安装swool时遇到的坑(root + openssl)
    php获取两个日期的之间的日期信息,返回数组
    2021.4.9训练
    王道数据结构代码:双向链表的操作
    王道数据结构代码:单链表的操作
    PTA 7-1 大炮打蚊子 (15 分)
  • 原文地址:https://www.cnblogs.com/Mr-WolframsMgcBox/p/7868292.html
Copyright © 2020-2023  润新知