-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(....))) // で配列を試しました#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

アルゴリズムを調整しないでください。アルゴリズムは明確です(「最小値を見つける」)。代わりに検索条件を調整し、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)で1回だけ実行されることです。

于 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 に答える
0

数値のコレクションで実行する場合std::sort、「最初の最小正」は単に「最初の正」になります。

そのソートされたコレクションを実行std::find_ifすると、最初の陽性を見つけることができます。

于 2011-12-22T16:57:05.633 に答える