输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
时间: 2024-05-27 15:13:33 浏览: 169
编写程序,以字符形式输入一个十六进制数,将其变换为一个十进制整数后输出。(要求:十六进制允许的字符是从0~9和a~f或A~F)
5星 · 资源好评率100%
暴力解法:
直接使用系统自带的函数将十六进制转换为十进制,再将十进制转换为二进制。代码如下:
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
string s;
cin >> s;
int num = stoi(s, 0, 16);
bitset<32> bin(num);
cout << bin.to_string().substr(bin.to_string().find('1')) << endl;
}
return 0;
}
其中,stoi函数可以将字符串转换为整数,第二个参数表示字符串的起始位置,第三个参数表示转换的进制。bitset可以将整数转换为二进制,并且可以指定位数,这里我们指定为32位。最后将二进制字符串截取掉前面的0输出即可。
优化解法:
由于题目要求将十六进制转换为二进制,我们可以直接将十六进制的每一位转换为对应的四位二进制,组成一个二进制字符串。代码如下:
#include <iostream>
#include <string>
using namespace std;
string hex2bin(char c) {
switch(c) {
case '0': return "0000";
case '1': return "0001";
case '2': return "0010";
case '3': return "0011";
case '4': return "0100";
case '5': return "0101";
case '6': return "0110";
case '7': return "0111";
case '8': return "1000";
case '9': return "1001";
case 'A': return "1010";
case 'B': return "1011";
case 'C': return "1100";
case 'D': return "1101";
case 'E': return "1110";
case 'F': return "1111";
}
return "";
}
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
string s;
cin >> s;
string bin;
for(int j=0; j<s.length(); j++) {
bin += hex2bin(s[j]);
}
cout << bin.substr(bin.find('1')) << endl;
}
return 0;
}
这里我们定义了一个函数hex2bin,将十六进制的每个字符转换为对应的四位二进制字符串。然后遍历输入的每个十六进制数的每一位,将其转换为对应的二进制字符串,最后将所有二进制字符串拼接起来即可。注意要将二进制字符串截取掉前面的0输出。
阅读全文