【问题标题】:Find closest number C++ using arrays, floats使用数组、浮点数查找最接近的数字 C++
【发布时间】:2014-10-29 01:40:31
【问题描述】:

我需要在给定数字中找到最接近(和次要)平均值的数字。例如:

如果给定的数字是 1、2、3、4、5,则平均值将为 3,最接近的数字是 2 和 4,但次要数字是 2,因此结果应该是 2。

或者,如果给定的数字是 1、325、350、299,则平均值将为 243.75,因此最接近的数字是 299。

int best = a[0];
for (i = 1; i < count; ++i)
best = abs(a[i] - x) < abs(best - x) ? a[i] : best;    

【问题讨论】:

  • 执行此操作时,您的数组是否始终排序?
  • 数字总是正数吗?
  • 这是作业吗?

标签: c++ average


【解决方案1】:

您的代码几乎是正确的...您只需要检查与平均 x 的距离是否与最佳距离相同,但在较小的一侧,而 best 不是t....

double i_delta = abs(a[i] - x);
double x_delta = abs(best - x);
if (i_delta < x_delta)
     best = a[i];
else if (i_delta == x_delta && a[i] < best)
     best = a[i];

(您必须通过值来计算平均值,因此您的整体算法将是 O(n)。因此,像您使用的额外迭代不会降低整体 big-O 效率。 .. 一切都好。)

【讨论】:

    【解决方案2】:

    这并不难,你应该能够做到。我假设这是您学校作业中的问题,而您没有心情

    int closest(int* array, int size){
    //Calculating sum for finding average first
        double sum = 0.0;
        for (int i=0; i< size; i++){
            sum+= array[i]*1.0;
        }
    //Here is our average
        double average = sum/size;
    //Assuming initial answer is very huge so that every other comparison is less than this
        int answer = 100000000;
        for (int i=0; i< size; i++){
    //Finiding the difference for current element
            double temp = abs(array[i]-average);
            double temp1 = abs(answer - average);
    //If current difference is less than previous one that replace the previous answer
            if (temp < temp1) answer = array[i];
    //If they are equal then accept the minor one
            else if (temp == temp1){
                if (array[i]< answer) answer = array[i];
            }
        }
    
        return answer;
    }
    

    附:在这里提出这样的问题并不是一个好习惯。您应该先尝试一下,然后通过尝试发布您的问题。

    【讨论】:

    • int answer = 100000000; 不鼓励使用任意大的值。如果完全需要上限,则应改用numeric_limits&lt;int&gt;::max()。另外,你的回答和问题中的代码基本一致。
    • 从示例中看来,值非常小,answer 仍处于 INT_MAX 的限制范围内
    • 这只是一个良好实践的问题。 INT_MAX 的值取决于系统。
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    相关资源
    最近更新 更多