原文地址: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