https://www.luogu.com.cn/problem/P2152链接地址
题目大意
这道题就是让算两个非常非常非常非常大的数的最大公约数。如果你一上来就想到了更像减损术,恭喜你拿到了20分,但是剩下的80分就要用到高精度算法了。
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll MAXLEN=1255,BASE=100000000,WIDTH=8; char readin[MAXLEN*8]={}; struct bigint{ ll s[MAXLEN],len; void init(){memset(s,0,sizeof(s));len=0;} bigint operator =(ll num){init();for(;num>0;){len++;s[len]=num%BASE;num/=BASE;}return *this;} bigint operator =(const char *str){ init(); ll numlen=strlen(str);len=(numlen+WIDTH-1)/WIDTH; for(int i=numlen-1,t=0,w;i>=0;i--,w*=10){ if((numlen-i-1)%WIDTH==0){w=1;t++;} s[t]+=w*(str[i]-48); } return *this; } bool operator <(const bigint &b)const{ if(b.len!=len)return len<b.len; for(int i=b.len;i>=1;i--)if(b.s[i]!=s[i])return s[i]<b.s[i]; return 0; } bool operator ==(const bigint &b)const{return !(b<*this)&&!(*this<b);} bigint operator -(const bigint &b)const{ bigint ans;ans.init();ans.len=len; for(int i=1;i<=len;i++){ ans.s[i]+=s[i]-b.s[i]; if(ans.s[i]<0){ans.s[i]+=BASE;ans.s[i+1]--;} } for(;ans.s[ans.len]==0&&ans.len>0;ans.len--); return ans; } void MUL2(){ for(int i=1;i<=len;i++)s[i]*=2;len+=5; for(int i=1;i<=len;i++){ s[i+1]+=s[i]/BASE; s[i]%=BASE; } for(;s[len]==0&&len>0;len--); } void DIV2(){ len+=5; for(int i=len;i>=1;i--){ if(s[i]&1)s[i-1]+=BASE; s[i]/=2; } for(;s[len]==0&&len>0;len--); } bool check_jo(){ if(len==0)return 1; else return s[1]%2==0; } void read(){memset(readin,0,sizeof(readin));scanf("%s",readin);*this=readin;} void print(){ if(len==0)printf("0"); else{printf("%lld",s[len]);for(int i=len-1;i>=1;i--)printf("%08lld",s[i]);} } }; bigint a,b,tans,c; int cnt=0; bigint GCD(bigint x,bigint y){ while(!(x==y)){ if(x<y)swap(x,y); if(x.check_jo()&&y.check_jo()){ x.DIV2();y.DIV2();cnt++; }else if(x.check_jo()&&!y.check_jo()){ x.DIV2(); }else if(!x.check_jo()&&y.check_jo()){ y.DIV2(); }else if(!x.check_jo()&&!y.check_jo()){ c.init();x=x-y; } } return x; } int main(){ a.init();b.init();tans.init(); a.read();b.read();tans=GCD(a,b); for(;cnt>0;cnt--)tans.MUL2(); tans.print(); return 0; }
然而我上面说的都是在扯淡。高精度还是python靠谱
并不正的正解(简单解)
import fractions print(fractions.gcd(int(input()),int(input())))
好了,这就是所谓的python大法好了。