【问题标题】:C++ Unable to get the correct answer for median valueC++ 无法得到中值的正确答案
【发布时间】:2019-11-27 18:10:34
【问题描述】:

好的,所以我创建了一个程序,它接收一个向量并计算中位数。虽然我得到了奇数的正确中值,但我得到了偶数的正确中值。这是我的代码:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    bool check;
    cout<<"Hello World";
    vector<double> vec;

    vec.push_back(2);
    vec.push_back(6);
    vec.push_back(8);
    vec.push_back(62);

    double median;
    if(check==vec.size()%2)
    {
        median=(vec[vec.size() / 2 - 1] + vec[vec.size() / 2]) / 2;
    }
    else{
         median=vec[(vec.size() / 2.0)];
    }
    cout<<median;
    return 0;
}

所以当我在线查看时,正确答案应该是 7,但我得到 8.. 这仅发生在偶数计算中.. 我做错了什么,我不明白

【问题讨论】:

  • check 的作用是什么?
  • 特别是考虑到check是未初始化的,因此有一个indeterminate值,当你使用它时会导致undefined behavior
  • 为什么不只是std::nth_element(vec.begin(), vec.begin() + vec.size()/2, vec.end()); std::cout &lt;&lt; "The median is " &lt;&lt; vec[vec.size()/2] &lt;&lt; '\n';
  • @JesperJuhl 他已经有一个排序的数据。现在他在处理奇数或偶数数据时遇到了问题。
  • @MarekR 它在 this 的情况下排序,是的。但我想提出一个不依赖预排序数据的通用解决方案。至于偶数与奇数大小,我认为您不需要处理超出我建议的范围。对于偶数个元素,您必须选择中点之前或之后的元素,但您选择哪个并不重要,我的解决方案始终选择较低的。这应该没问题。唯一要处理的极端情况是空向量。

标签: c++ vector median


【解决方案1】:

我重写了您的代码并清理了一些不必要的变量。我计算了数组大小n 和中点centerElement。您不希望专门在数组非常大的情况下重复执行此计算。

我还删除了布尔变量check,这是完全没有必要的。您可以通过将其与0进行比较来简单地比较模运算的输出

    #include <iostream>
    #include <vector>
    using namespace std;

    int main()

{
    vector<double> vec;    
    vec.push_back(2);
    vec.push_back(6);
    vec.push_back(8);
    vec.push_back(100);
    auto n = vec.size();
    auto centerElement = n/2;

    double median;
    if(n%2 == 0)
    {
        median=(vec[centerElement - 1] + vec[centerElement]) / 2;
    }
    else{
         median=vec[(centerElement)];
    }
    cout<<median;
    return 0;
}

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多