描述:解析9进制、11进制的字符串为10进制的数字输出,输入的字符串有效位(0v0012345678)长度不超过8位,前面的00不算做有效位。解析后以10进制的数字输出。如果解析到非法的字符串则返回-1。
9进制:
9进制数的范围:0、1、2、3、4、5、6、7、8
9进制的开始为:0V或0v
9进制的正确实例:0v11 0v564 0v123 0v0784 0v0 0v 0V
9进制的错误实例:0v923 0vt12 00V21 0123
0v564 -> 463
11进制:
11进制的数的范围:0、1、2、3、4、5、6、7、8、9、A(a)
11进制的开始为:0w或者0W
11进制的正确实例:0w11 0w564 0w123 0w0ABa 0W 0w
11进制的错误实例:0wB923 0wVaA 00W21 0WAx123
11进制转化为10进制:
0w11 -> 12
0W564 -> 675
运行时间限制:无限制
内存限制:无限制
输入:输入为一行9进制或11进制的字符串,格式如上述
输出:输出为10进制的数字
样例输入:0W564
样例输出:675
解答:
该题的C++代码如下:
/*************************************************
九进制和十一进制数转化为十进制数
************************************************/
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main()
{
string str;
unsigned long result=0;
int flag;
int count=0;
cin>>str;
if(str.size()>=2)
{
if(str[0]=='0')
{
if(str[1]=='v'||str[1]=='V')
flag=9;
else if(str[1]=='w'||str[1]=='W')
flag=11;
else
{
cout<<"-1"<<endl;
return 0;
}
}
else
{
cout<<"-1"<<endl;
return 0;
}
}
else
{
cout<<"-1"<<endl;
return 0;
}
if(str.size()>2)
{
for(int i=2;i<str.size();i++)
{
if(9==flag)
{
if((str[i]>'8')||(str[i]<'0'))
{
cout<<"-1"<<endl;
return 0;
}
}
if(11==flag)
{
if(!isdigit(str[i])&&(str[i]!='A'&&str[i]!='a'))
{
cout<<"-1"<<endl;
return 0;
}
}
}
}
else
{
printf("%ld\n",result);
return 0;
}
int temp;
for(int i=2;i!=str.size();i++)
{
if(isdigit(str[i]))
temp=str[i]-'0';
else
temp=10;
result=result*flag+temp;
if(str[i]>'0'||str[i]=='a'||str[i]=='A') //用count来统计有效位的个数,超过8位要报错
count++;
if(count>8)
{cout<<-1<<endl;
return 0;
}}
printf("%ld\n",result);
return 0;
}