这是此问题的后续问题:
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
答案 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的每个素因子迭代一次;
然后他用它来计算素因子。
然后用它们划分适当的分子/分母术语。