已知
a
、
b
a、b
a、b的值,且已知其可以表示为如下形式:
a
=
q
k
0
,
b
=
q
k
1
(
q
、
k
0
、
k
1
均
为
正
整
数
)
a=q^{k_0},b=q^{k_1} (q、k_0、k_1均为正整数)
a=qk0,b=qk1(q、k0、k1均为正整数)
求
p
p
p,使得:
p
=
q
g
,
g
=
g
c
d
(
k
0
,
k
1
)
p=q^{g},g=gcd(k_0,k_1)
p=qg,g=gcd(k0,k1)
p
p
p称为
a
、
b
a、b
a、b间最大共比例。
当需要求很多个数的最大公比例时,直接求底数和指数很麻烦。于是我们可以运用辗转相减法来解决:
设
Q
(
a
,
b
)
Q(a,b)
Q(a,b)为
a
,
b
a,b
a,b间最大公比例,则
Q
(
a
,
b
)
=
Q
(
q
k
0
,
q
k
1
)
=
q
g
c
d
(
k
0
,
k
1
)
=
q
g
c
d
(
k
1
,
k
1
−
k
0
)
=
Q
(
q
k
1
,
q
k
1
−
k
0
)
=
Q
(
b
,
b
/
a
)
Q(a,b)=Q(q^{k_0},q^{k_1})=q^{gcd(k0,k1)}=q^{gcd(k1,k_1-k_0)}=Q(q^{k_1},q^{k_1-k_0})=Q(b,b/a)
Q(a,b)=Q(qk0,qk1)=qgcd(k0,k1)=qgcd(k1,k1−k0)=Q(qk1,qk1−k0)=Q(b,b/a)
反复进行操作,直到a==b,就可以得到最大公比例。
用于此题的辗转相减法代码:
long gcd_sub(long a,long b)//辗转相减的另一种使用
{
if(a==b) return a; //这里一定会 出现这种情况的 因为我们的b和a是倍数关系
if(a>b) return gcd_sub(b,a/b);//我们保证a>b
else return gcd_sub(b,a);
}