1. 程式人生 > >歐幾里得演算法(除法表示式)

歐幾里得演算法(除法表示式)

題意:
給出一個這樣的除法表示式:X1/X2/X3/···/Xk,其中Xi是正整數。除法表示式應當按照從左到右的順序求和,例如表示式1/2/1/2的值為1/4。但是可以在表示式中嵌入括號以改變計算順序,例如表示式(1/2)/(1/2)的值為1.
分析:
這裡是為了介紹歐幾里得演算法所以其他的思路就不再說明。
表示式的值可以寫做A/B,A是其中一些Xi的乘積,而B是剩下的數的乘積。可以發現X2一定在分母的位置。其他數可以有這種結果:
E=X1/(X2/X3/X4…/Xn)=(X1X3X4…Xn)/X2
題目也就轉化成了E是否能為整數。
方法:
每次約掉Xi與X2的最大公約數gcd(Xi,X2),則只有結束後X2=1時E為整數。

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a%b);
}
int judge(int *x) {
    x[2] /= gcd(x[2], x[1]);
    for (int i = 3; i <= k; i++)
        x[2] /= gcd(x[2], x[i]);
    return x[2] == 1;
}

此外gcd還可以求最小公倍數lcm(a,b),因為由分解定理知:
lcm(a,b)*gcd(a,b)=a*b.所以可以通過除法來求解最小公倍數,但是形式要注意:lcm(a,b)=a/gcd(a,b)*b,若不寫成這樣,讓a與b相乘然後除最大公約數會有可能導致溢位。