欧几里得算法(除法表达式)

题意:
给出一个这样的除法表达式: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相乘然后除最大公约数会有可能导致溢出。

你可能感兴趣的:(数论)