传送门:最大公约数
思路:纯纯的高精度加模拟求公约数。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> get(vector<int>&a,vector<int>&b )
{
vector<int>c;
int t=0;
for(int i=0;i<a.size();i++)
{
t=a[i]-t;
if(i<b.size()) t-=b[i];
c.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(c.size()>1&&c.back()==0) c.pop_back();
return c;
}
void output(vector<int>&a)
{
for(int i=a.size()-1;i>=0;i--)
cout<<a[i];
return;
}
int main()
{
string a,b;
vector<int>A,B;
cin>>a>>b;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)
B.push_back(b[i]-'0');
while(1)
{
vector<int>aa(A.rbegin(),A.rend());
vector<int>bb(B.rbegin(),B.rend());
if(aa.size()>bb.size()||(aa.size()==bb.size()&&aa>bb))
{
auto c=get(A,B);
if(c.size()==B.size()&&c==B)
{
output(c);
break;
}
A=B,B=c;
}else
{
auto c=get(B,A);
if(c==A&&c.size()==A.size())
{
output(c);
break;
}
B=c;
}
}
return 0;
}