-2
    string result;

    double zpls, zmin, ypls, ymin, xpls, zmin ;

    zpls = 4.2;
    zmin = 0;
    ypls = -2;
    ymin = 4.2;
    xpls = 6;
    xmin = 8;

如何在这些值中找到“第一个最小正数”并设置

    result = "+Z";// or wichever value is lowest -z, +Y etc  

(在 C++ 中)

我尝试了数组,if else 和 min(zpls,min(zmin,min(....))) // with#include <algorithm>

但无法正确获取

谢谢

4

4 回答 4

2

只要你有自变量中的数据,你就需要做一个 if-else

result = ""; // no result yet
double minValue = std::numeric_limits<double>::max( );
if( zplus > 0 && zpls < minValue ) {
  minValue = zpls;
  result = "+Z"
}
if( zmin > 0 && zmin < minValue ) {
  minValue = zmin;
  result = "-Z"
}

依此类推,以这种模式。最后result要么有你想要的字符串,要么是空的(在这种情况下,没有正值。)

这是一个完整的示例:

#include <iostream>
#include <limits>
#include <string>

int main () {
    std::string result;

    double zpls, zmin, ypls, ymin, xpls, xmin ;

    zpls = 4.2;
    zmin = 0;
    ypls = -2;
    ymin = 4.2;
    xpls = 6;
    xmin = 8;

    result = ""; // no result yet
    double minValue = std::numeric_limits<double>::max( );
    if( zpls > 0 && zpls < minValue ) {
      minValue = zpls;
      result = "+Z";
    }
    if( zmin > 0 && zmin < minValue ) {
      minValue = zmin;
      result = "-Z";
    }
    if( ypls > 0 && ypls < minValue ) {
      minValue = ypls;
      result = "+Y";
    }
    if( ymin > 0 && ymin < minValue ) {
      minValue = ymin;
      result = "-Y";
    }

    if( xpls > 0 && xpls < minValue ) {
      minValue = xpls;
      result = "+X";
    }
    if( xmin > 0 && xmin < minValue ) {
      minValue = xmin;
      result = "-X";
    }


    std::cout << "The first mininum positive element is: " << result << "\n";
}
于 2011-12-22T17:03:52.473 回答
0

如果您std::sort在任何数字集合上运行,“第一个最小正数”将只是“第一个正数”。

如果你std::find_if在那个排序的集合上运行,你会发现第一个积极的。

于 2011-12-22T16:57:05.633 回答
0

不要调整算法。算法很明确(“找到最小值”)。改为调整搜索条件,并保持在 O(n) 范围内。

代码。

#include <algorithm>
#include <vector>
#include <iostream>
int main () {
    // std::min_element()
    std::vector<float> vec;

    vec.push_back(0);
    vec.push_back(-1);
    vec.push_back(-2);
    vec.push_back(2);
    vec.push_back(4);

    auto cmp = [](float lhs, float rhs) {
        const bool lz = lhs < 0,
                   rz = rhs < 0;
        if (lz && rz) return lhs < rhs;
        if (lz) return false;
        if (rz) return true;
        return lhs < rhs;
    };

    const float mp = *std::min_element (vec.begin(), vec.end(), cmp);        
    std::cout << mp << '\n';

    // demonstration of our comparison
    sort (vec.begin(), vec.end(), cmp);
    for (auto it=vec.begin(), end=vec.end(); it!=end; ++it)
        std::cout << *it << " ";
    std::cout << std::endl;
}

输出。

0
0 2 4 -1 -2

解释。

我们的排序函数被编码在cmp. 它检查其操作数的符号。如果两者都是负数,则较大的获胜。如果只有 LHS 是负数,则在排序中自动首选 RHS。相反,如果 RHS 为负,则首选 LHS。两者都是积极的,我们回到正常秩序。

好消息是,这在范围内和 O(n) 中只运行了一次。

于 2011-12-22T17:04:40.913 回答
0

真的需要单独的变量吗?为什么不这样设计:

enum Tags
{
 ZPlus,
 ZMinus,
 Etc
};

const std::string [] names = {"z+", "z-", "etc" }

int values[3];

并且zmin = -3;你得到然后你可以在数组values[ZMinus] = -3; 中找到最小索引和valuesreturn names[minimumIndex];

于 2011-12-22T17:16:36.263 回答