简化容器内部的比例

时间:2019-04-21 23:21:35

标签: c++ c++17

假设给定一个比率容器,并且您想将比率简化为最小的整数。

输入:

std::vector<int> v1 = { 10, 20 , 30, 40 };

输出:

1,2,3,4

如何解决n尺寸容器的问题?我正在寻找通用解决方案,该解决方案适用于任意数量的元素和任何整数值。

2 个答案:

答案 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()将进行比较不同手势的数量