版本号比较(Compare two Version numbers)

原文地址:Compare two Version numbers

版本号是用来识别软件产品状态的字符串,一个版本号看起来像a.b.c.d,这里的a,b等都是数字,所以版本号是数字用点分开的字符串。版本号一般是从最大到最小这么个层级表示的(这里a是最大的,d是最小的)。

在这个问题中,我们已知两个版本号,然后我们通过比较得出哪个是最近的版本号(也就是说哪个版本号更小)。【译者注:这里貌似跟我没一般的版本号规则有点差异,我们一般是数字越大,版本越新,不过随便了,这里的重点不是大小与新旧的关系】

例如,如果
V1 = “1.0.31”
V2 = “1.0.27”
那么V2版本是最新的(或更小) 
因为V2 < V1

因为有‘.’,所以我们不能拿出来就直接比较,但是我们可以比较它们的数字部分,然后看看哪个版本是最新的。下面代码的实现方法是遍历这个字符串,分割数字部分并进行比较,如果相等,那就再去看下一个数字部分,直到比出不想等的部分,否则的话就标为相同。

下面的代码实现的是比较两个版本号,如果有多个版本号的话,下面的方法可以用于版本号排序的比较方法,然后就能把所有的版本号都排个序。

//  C/C++ program to compare two version number
#include <bits/stdc++.h>
using namespace std;

//  Method to compare two versions. Returns 1 if v2 is
// smaller, -1 if v1 is smaller, 0 if equal
int versionCompare(string v1, string v2)
{
    //  vnum stores each numeric part of version
    int vnum1 = 0, vnum2 = 0;

    //  loop untill both string are processed
    for (int i=0,j=0; (i<v1.length() || j<v2.length()); )
    {
        //  storing numeric part of version 1 in vnum1
        while (i < v1.length() && v1[i] != '.')
        {
            vnum1 = vnum1 * 10 + (v1[i] - '0');
            i++;
        }

        //  storing numeric part of version 2 in vnum2
        while (j < v2.length() && v2[j] != '.')
        {
            vnum2 = vnum2 * 10 + (v2[j] - '0');
            j++;
        }

        if (vnum1 > vnum2)
            return 1;
        if (vnum2 > vnum1)
            return -1;

        //  if equal, reset variables and go for next numeric
        // part
        vnum1 = vnum2 = 0;
        i++;
        j++;
    }
    return 0;
}

//  Driver method to check above comparison function
int main()
{
    string version1 = "1.0.3";
    string version2 = "1.0.7";

    if (versionCompare(version1, version2) < 0)
        cout << version1 << " is smaller\n";
    else if (versionCompare(version1, version2) > 0)
        cout << version2 << " is smaller\n";
    else
        cout << "Both version are equal\n";
    return 0;
}

输出:

1.0.3 is smaller
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值