问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入
FFFF
样例输出
65535
对于将字符串类型的数字转化为10进制整数的问题,string头文件中的stoi函数可以简单的解决
如下
int main(){
string a="";
cin>>a;
int k= stoi(a,0,16);
cout<<k;
return 0;
}
但由于练习系统不支持C11+
采用如下办法
#include<iostream>
#include<string>
using namespace std;
int hexCharToInt(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
return -1; // 非法字符
}
int main() {
string hexString;
cin >> hexString;
int decimal = 0;
int len = hexString.length();
for (int i = 0; i < len; ++i) {
char c = hexString[i];
int digit = hexCharToInt(c);
decimal = decimal * 16 + digit;
}
cout <<decimal;
return 0;
}
发现四个测试,前三个通过了,最后一个没通过,想一想可能是题目里的“不超过8位”条件限制
于是修改,发现记录十六进制长度的len需要为long类型,而decimal(转换后的十进制数)则需要是long long类型,显然与题目要求不符,但没办法
#include<iostream>
#include<string>
using namespace std;
int hexCharToInt(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
return -1; // 非法字符
}
int main() {
string hexString;
cin >> hexString;
long long decimal = 0;
long len = hexString.length();
bool isNegative = false;
if (hexString[0] == '-') {
isNegative = true;
hexString = hexString.substr(1); // 去除负号
len--; // 减少字符串长度
}
for (int i = 0; i < len; ++i) {
char c = hexString[i];
int digit = hexCharToInt(c);
decimal = decimal * 16 + digit;
}
if (isNegative) {
decimal = -decimal;
}
cout << decimal;
return 0;
}
修改后的代码还增加了负数转换的缺陷,使用一个bool变量解决