6

私たちの教授は、0.1 < 0.2 または 1 < 1.1 のように、2 つのバージョン番号を比較するプログラムを作成するように求めています。また、.0.4 < .1 のようなトリックもあります。したがって、私の考えは、数字がドットで始まるかどうかを最初に判断し、そうであれば、それに0を追加することです。その後、最初のドット以外のドットを削除します。次に、文字列を数値に変換して比較します。これが私が最初のステップで行うことです。

string numb1,numb2;
if(numb1[0]=='.')
{
    numb1 ="0"+ numb1;
}

2 番目の数字についても同じことを行います。そして今、最初のドット以外のドットを削除する方法を教えてください。私たちの教授は、この特定の関数を使用することを望んでいます: int compareVersions(string ver1, string ver2)。ver1 > ver2 の場合: ver1 < ver2 の場合は 1 を返し、それ以外の場合は -1 を返し、それ以外の場合は 0 を返します。

ちなみに、ビジョン番号の一部は、2.3.2.2.3.1.1.5.3.5.6.2 や 1.1.1.1.1.1.1 のように非常に長い場合があります。

4

5 に答える 5

1

あなたがする必要があるのは、「。」を無視して、文字列を反復処理することです。数値の char 表現を int に変換します。次に、2 つの最終結果を比較します。

string numb1 = "4.3.2";
string numb2 = "3.4.5";
int n1 = 0;
int n2 = 0; 

for (int i = 0; i < numb1.length(); i++)
{
    if (numb1[i] != '.')
    {   
        n1 = n1 * 10;
        n2 = n2 * 10;
        n1 += (int(numb1[i]) - '0');
        n2 += (int(numb2[i]) - '0');                
    }

}

これにより、432 と 345 が得られます。これらを比較すると、どちらがより高いバージョンであるかがわかります。

于 2015-10-14T21:14:04.950 に答える
1

このようなものはチェックを行うために機能し、かなり最小限です。ブーストを使用して文字列を分割し、バージョンを段階的に比較します。欠落している先行ゼロを自動的に処理します。

#include <boost/algorithm/string.hpp>
#include <string>
#include <vector>
#include <iostream>

int version_a_newer_than_b(const std::string& a, const std::string& b)
{
    // First, split the string.
    std::vector<std::string> va, vb;
    boost::split(va, a, boost::is_any_of("."));
    boost::split(vb, b, boost::is_any_of("."));

    // Compare the numbers step by step, but only as deep as the version
    // with the least elements allows.
    const int depth = std::min(va.size(), vb.size());
    int ia,ib;
    for (int i=0; i<depth; ++i)
    {
        ia = atoi(va[i].c_str());
        ib = atoi(vb[i].c_str());
        if (ia != ib)
            break;
    }

    // Return the required number.
    if (ia > ib)
        return 1;
    else if (ia < ib)
        return -1;
    else
    {
        // In case of equal versions, assumes that the version
        // with the most elements is the highest version.
        if (va.size() > vb.size())
            return 1;
        else if (va.size() < vb.size())
            return -1;
    }

    // Everything is equal, return 0.
    return 0;
}

int main()
{
    std::string a = "0.1.32.8";
    std::string b = "0.1";

    std::cout << "Is a newer than b: " << version_a_newer_than_b(a, b) << std::endl;

    return 0;
}
于 2015-10-14T21:15:08.500 に答える