减少整数分数算法 - 解决方案解释?

时间:2012-09-10 21:31:40

标签: c++ algorithm math c++11

这是此问题的后续问题:

Reducing Integer Fractions Algorithm

以下是来自大师的问题的解决方案:

#include <cstdio>
#include <algorithm>
#include <functional>

using namespace std;

const int MAXN = 100100;
const int MAXP = 10001000;

int p[MAXP];

void init() {
    for (int i = 2; i < MAXP; ++i) {
        if (p[i] == 0) {
            for (int j = i; j < MAXP; j += i) {
                p[j] = i;
            }
        }
    }
}

void f(int n, vector<int>& a, vector<int>& x) {
    a.resize(n);
    vector<int>(MAXP, 0).swap(x);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        for (int j = a[i]; j > 1; j /= p[j]) {
            ++x[p[j]];
        }
    }
}

void g(const vector<int>& v, vector<int> w) {
    for (int i: v) {
        for (int j = i; j > 1; j /= p[j]) {
            if (w[p[j]] > 0) {
                --w[p[j]];
                i /= p[j];
            }
        }
        printf("%d ", i);
    }
    puts("");
}

int main() {
    int n, m;
    vector<int> a, b, x, y, z;

    init();
    scanf("%d%d", &n, &m);
    f(n, a, x);
    f(m, b, y);
    printf("%d %d\n", n, m);
    transform(x.begin(), x.end(), y.begin(),
        insert_iterator<vector<int> >(z, z.end()),
        [](int a, int b) { return min(a, b); });
    g(a, z);
    g(b, z);

    return 0;
}

我不清楚它是如何工作的。谁能解释一下呢?

等同性如下:

a is the numerator vector of length n
b is the denominator vector of length m

2 个答案:

答案 0 :(得分:3)

init只需填充数组P,以便P[i]包含i的最大素因子。

f(n,a,x)x填充a中的数字被每个素数整除的次数,计数次数多次。实际上,它计算a

产品的主要因子分解

g(v,w)获取数字v列表和素数分解w,并将v中的任何元素与w中的公因子除去,直到它们没有共同因子为止。 (除去素数因子分解意味着将功率减去1)。

现在我们有了main。首先,它初始化P数组并读入数据长度(奇怪的是它似乎永远不会在数据本身中读取)。然后它分别将元素乘积的主要分解存储在a和b中的x和y中。然后,它在循环中使用lambda表达式,将这两个因子分解中的元素最小化,从而给出最大公因子的因子分解。最后,它通过这个共同因素划分a和b中的元素。

答案 1 :(得分:0)

想出来:

p [i]是i

的最高素因子

所以循环:

for (int i = x; i > 1; i /= p[i])
{
    p[i] is prime factor of x;
}

将针对x的每个素因子迭代一次;

然后他用它来计算素因子。

然后用它们划分适当的分子/分母术语。