题目:
给定软件的版本号的表达方式,以及一些版本号,请找出最新的版本。例如:
1. 1.2, 2,2 最新的是2.2
2. 3.1, 3.1.3 最新的是3.1.3
上面的版本号,都是用字符串表示的。
解答:
基于两两比较的方法。
写一个函数,bool compareVesion(char* string1, char* string2).
错误之处在于:
1. 没有考虑输入字符有错误的情况
2. 没有考虑版本号有多个字符构成数字的情况,如12.34.4
3. 把&写成了and
直接写:
#include "iostream"
using namespace std;
int compareVersion(char* version1, char* version2)
{
if(strcmp(version1, version2)==0)
return 0;
int length1 = strlen(version1);
int length2 = strlen(version2);
int tmp = 0;
while(tmp<length1 and tmp<length2)
{
if(version1[tmp]>version2[tmp])
return 1;
else if(version1[tmp]<version2[tmp])
return -1;
else
continue;
}
if(tmp==length1)
return -1;
else
return 1;
}
void main()
{
char* ver1 = new char[256];
char* ver2 = new char[256];
cin>>ver1;
cout<<"version1= "<<ver1<<endl;
cin>>ver2;
cout<<"version2= "<<ver2<<endl;
int result = compareVersion(ver1, ver2);
if(result == 0)
cout<<"the same"<<endl;
else if(result == 1)
cout<<"ver1>ver2"<<endl;
else
cout<<"ver1<ver2"<<endl;
}
修改后:
#include "iostream"
using namespace std;
int compareVersion(char* version1, char* version2)
{
if(strcmp(version1, version2)==0)
return 0;
int length1 = strlen(version1);
int length2 = strlen(version2);
int tmp1 = 0, tmp2 = 0;
int index1 = 0, index2 = 0;
while(index1<length1 && index2<length2)
{
tmp1 = 0;
tmp2 = 0;
while(index1 < length1 && version1[index1] >='0' && version1[index1]<='9')
{
tmp1 *= 10;
tmp1 += version1[index1]-'0';
index1++;
}
if (index1 != length1 && version1[index1]!='.')
{
return -2;
}
else
{
index1++;
}
while(index2 < length2 && version2[index2] >= '0' && version2[index2] <='9')
{
tmp2 *= 10;
tmp2 += version2[index2]-'0';
index2++;
}
if(index2 != length1 && version2[index2]!='.')
{
return -3;
}
else
{
index2++;
}
if(tmp1>tmp2)
return 1;
else if(tmp1<tmp2)
return -1;
else
continue;
}
if(index1==length1)
return -1;
else
return 1;
}
void main()
{
char* ver1 = new char[256];
char* ver2 = new char[256];
cin>>ver1;
cout<<"version1= "<<ver1<<endl;
cin>>ver2;
cout<<"version2= "<<ver2<<endl;
int result = compareVersion(ver1, ver2);
if(result == 0)
cout<<"the same"<<endl;
else if(result == 1)
cout<<"ver1>ver2"<<endl;
else if(result == -2)
cout<<"ver1 is wrong!"<<endl;
else if(result == -3)
cout<<"ver2 is wrong!"<<endl;
else
cout<<"ver1<ver2"<<endl;
}