您的位置:首页 > 其它

HDU 2504 又见GCD【递归】

2014-07-25 00:57 295 查看
原题链接。

今天发现一个更好的方法,运用欧几里得算法,递归来求最大公约数。

可当做模板来记。

AC码1:直接求c

#include<cstdio>
int gcd(int a,int b)            //欧几里德算法 辗转相除法
{
return b?gcd(b,a%b):a;
}
int main()
{
int n,a,b,c;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
for(c=b<<1; ;c+=b)			//b<<1 相当于b*2 不过前者更快
if(gcd(a,c)==b)
break;
printf("%d\n",c);
}
return 0;
}


AC码2:求c的另一个因子
#include<stdio.h>
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int a,b,i,j,t,d,n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&a,&b);
d = a/b;				//取a除以b的另一个因子
for(i=2;;i++)
if(gcd(d,i)==1)			//a和c 除 b 外的两个因子必互斥 (即二者gcd等于1) c必为b的整数倍
break;
printf("%d\n",i*b);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: