假设给定一个比率容器,并且您想将比率简化为最小的整数。
输入:
std::vector<int> v1 = { 10, 20 , 30, 40 };
输出:
1,2,3,4
如何解决n尺寸容器的问题?我正在寻找通用解决方案,该解决方案适用于任意数量的元素和任何整数值。
答案 0 :(得分:7)
反复对向量中的所有数字应用std::gcd
,以找到所有数字的gcd,然后将每个元素除以gcd。
const int gcd = std::reduce(v1.cbegin(), v1.cend(), 1, [](int a, int b) {
return std::gcd(a, b);
});
if (gcd != 1) {
for (int &elem : v1) {
elem /= gcd;
}
}
答案 1 :(得分:7)
GCD算法是关联的,这意味着GCD(a, b, c, d)
等效于GCD(GCD(GCD(a, b), c), d)
,因此我们可以将其循环运行并应用于每个连续对。如果序列为空,则返回1,因为每个数字都可以被1整除。
#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
int gcd_of_all(const std::vector<int>& values)
{
if (values.empty())
return 1; // division by 1 does nothing
int result = values[0];
for (std::size_t i = 1; i < values.size(); ++i)
{
result = std::gcd(result, values[i]);
}
return result;
}
int main()
{
std::vector<int> v = { 10, 20, 30, 40 };
int gcd = gcd_of_all(v);
std::cout << "gcd: " << gcd << "\n";
for (int& elem : v)
elem /= gcd;
for (int elem : v)
std::cout << elem << " ";
}
其他:之所以使用std::size_t i = 1; i < values.size(); ++i
而不是通常的int i = 1;...
是因为如果使用int,则会触发编译器警告,因为i < values.size()
将进行比较不同手势的数量