Luogu P2152[SDOI 2009]Super GCD
题目
没有任何思维含量,但是压位高精能搞一天
为了避免这种情况,是时候发挥python水高精的作用了
本人代码
a=(int)(input())
b=(int)(input())
c=a%b
while c!=0:
a=b
b=c
c=a%b
print(b)
来自Blueqwq
import fractions
print(fractions.gcd(int(input()),int(input())))
来自XiEn1847
Ruby真短
#!/usr/bin/ruby
puts gets.to_i.gcd(gets.to_i)
来自wsy_jim
认真写压位高精的好孩子
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=10010,width=8,B=100000000;
char readin[1255*8]={};
struct bigint{
int len;
int a[N];
void init(){memset(a,0,sizeof a);len=0;}
bigint operator = (ll num){init();for(;num>0;){len++;a[len]=num%B;num/=B;}return *this;}
bigint operator = (const char *num){
init();
len=(strlen(num)+width-1)/width;
for(int i=strlen(num)-1,t=0,w;i>=0;i--,w*=10){
if((strlen(num)-i-1)%width==0) w=1,t++;
a[t]+=w*(num[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.a[i]!=a[i]) return a[i]<b.a[i];
return 0;
}
bigint operator - (const bigint &b){
bigint c;
c.init();
c.len=len;
for(int i=1;i<=len;i++){
c.a[i]+=a[i]-b.a[i];
if(c.a[i]<0){c.a[i]+=B;c.a[i+1]--;}
}
for(;c.a[c.len]==0&&c.len>0;c.len--);
return c;
}
bool operator == (const bigint &b){
return !(b<*this)&&!(*this<b);
}
void mul2(){
for(int i=1;i<=len;i++) a[i]*=2;len+=5;
for(int i=1;i<=len;i++){
a[i+1]+=a[i]/B;
a[i]%=B;
}
for(;a[len]==0&&len>0;len--);
}
void div2(){
len+=5;
for(int i=len;i>=1;i--){
if(a[i]&1) a[i-1]+=B;
a[i]/=2;
}
for(;a[len]==0&&len>0;len--);
}
bool check_jo(){
if(len==0) return 1;
else return a[1]%2==0;
}
void read(){
memset(readin,0,sizeof readin);
scanf("%s",readin);
*this=readin;
}
void print(){
if(len==0) printf("0");
else{
printf("%d",a[len]);
for(int i=len-1;i>=1;i--) printf("%08d",a[i]);
}
}
}a,b,ans;
int cnt=0;
int main(){
a.init();b.init();ans.init();
a.read();b.read();
while(!(a==b)){
if(a<b) swap(a,b);
if(a.check_jo()&&b.check_jo()) a.div2(),b.div2(),cnt++;
else if(a.check_jo()&&!b.check_jo()) a.div2();
else if(!a.check_jo()&&b.check_jo()) b.div2();
else if(!a.check_jo()&&!b.check_jo()) a=a-b;
}
ans=a;
while(cnt--){
ans.mul2();
}
ans.print();
return 0;
}