C++从两个大小相同的不同整数数组中寻找最小商

C++ Finding the minimum quotient from two different integer arrays of the same size

本文关键字:整数 相同的不同 数组 寻找 两个 C++      更新时间:2023-10-16

我有两个不同的数组,分子[],分母[]和int大小为9。它们都由9个不同的整数组成,我需要找到2 int的最低商(百分比-(分子[])/(分母[]))。我该怎么做?

您想返回百分比还是商(不带余数)?以下代码返回百分比。如果您想要商,请将double改为int。

#include<limits>
double lowestQuotient(const int *numerator, const int *denominator)
{
  double min=DBL_MAX;
  double quotient;
for(i=0;i<9;i++)
{
  if (denominator[i]==0)
      continue;
  quotient = (double)numerator [i]/denominator [i];
  if (i==0 || quotient<min)
     min=quotient;
}
return min;
}

编辑:这个答案是在问题陈述更改之前写的,目的是澄清我们的意图不是比较每个组合,而是只取成对的商。这大大简化了问题,使我在这里的冗长解决方案显得过于冗长。这也是在指出涉及浮点值的解决方案之前编写的;我假设提问者对两个整数的商的数学定义感兴趣,这本身就是一个整数。尽管如此,我还是要把这个留给后人

编辑2:修复了编译错误——感谢James Root指出错误

这首先是一道数学题,其次是一道编程题。

最简单的实现是计算第一个数组的分子除以第二个数组的分母的每个组合,跟踪最小商,然后计算结果。

这看起来像以下内容:

#include <climits>
#include <algorithm>
int minimum_quotient(int numerator[], int denominator[], int size)
{
    int minimum = INT_MAX; // minimum quotient
    for (int i = 0; i < size; ++i)
        for (int j = 0; j < size; ++j)
            if (denominator[j] != 0) // avoid division by 0
                minimum = std::min(minimum, numerator[i] / denominator[j]);
    return 0;
}

由于size是一个已知的小数字,这应该足够了。然而,如果我们担心size变得非常大的情况,我们可能希望避免上面写的解决方案,它与输入大小的平方成比例。

这里有一个解决方案的想法,它可以更好地扩展到更大的尺寸。具体来说,它与输入的大小成线性比例。我们可以利用以下事实:

如果分子和分母都有相同的符号,那么最小的商将来自绝对值最小的分子和绝对值最大的分母。

如果分子和分母的符号相反,则相反:对于最小的商,我们想要绝对值最大的分子和绝对值最小的分母。

我们可以对这两个列表进行一次迭代,累积最大和最小的分子和分母,然后在最后对它们进行比较,以找到最小的商:

#include <climits>
#include <algorithm>
int minimum_quotient(int numerator[], int denominator[], int size)
{
    int min_num = INT_MAX, min_den = INT_MAX;
    int max_num = INT_MIN, max_den = INT_MIN;
    for (int i = 0; i < size; ++i)
    {
        min_num = std::min(min_num, numerator[i]);
        max_num = std::max(max_num, numerator[i]);
        min_den = std::min(min_den, denominator[i]);
        max_den = std::max(max_den, denominator[i]);
    }
    int minimum = INT_MAX;
    if (min_den != 0)
    {
        minimum = std::min(minimum, min_num / min_den);
        minimum = std::min(minimum, max_num / min_den);
    }
    if (max_den != 0)
    {
        minimum = std::min(minimum, min_num / max_den);
        minimum = std::min(minimum, max_num / max_den);
    }
    return minimum;
}