分析:只需要求出最大公约数,然后枚举最大公约数的因子,把他们保存起来在求第K大的;因为是最大公约数的因子必然是两个数的因子。另外循环变量i和个数cnt都要声明为__int64,否则出错。
#include<iostream>
#include<algorithm>
using namespace std;
__int64 gcd(__int64 x,__int64 y)
{
__int64 r;
while(y)
{
r=x%y;
x=y;
y=r;
}
return x;
}
__int64 f[1000005];
int main()
{
int T;
__int64 X,Y,K,_gcd,i,cnt;
scanf("%d",&T);
while(T--)
{
scanf("%I64d %I64d %I64d",&X,&Y,&K);
_gcd=gcd(X,Y);
cnt=0;
for(i=1;i*i<=_gcd;i++)
{
if(_gcd%i==0)
{
if(i*i==_gcd)
f[cnt++]=i;
else
{
f[cnt++]=i;
f[cnt++]=_gcd/i;
}
}
}
if(K>cnt)
puts("-1");
else
{
sort(f,f+cnt);
printf("%I64d\n",f[cnt-K]);
}
}
return 0;
}原文地址:http://blog.csdn.net/a809146548/article/details/45667711