16进制转换为10进制数
题目描述
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
题目分析
首先得将16进制数转换为4位二进制数,装入到字符串中,再从字符串总从末尾开始,逐一将2进制转换为10进制数字。(从末尾转换就不存在倒序转换问题
),由于题目描述16进制数可能最大为8位,则需要考虑十进制数的大小问题,此处定义采用long long
类型。
代码实现
此处当初为了循环输入输出,所以定义了数组字符串,单个可以不用数组
#include <iostream> #include <math.h> #include <string> using namespace std;
int main() { int n = 1, i = 0, j = 0, temp = 0; long long nNum = 0; char ch; string strHex[10]; string strBin[10]; for (i = 0; i < n; i++) { cin>>strHex[i]; }
for (i = 0; i < n; ++i) { j = 0; while (strHex[i][j]) { switch(strHex[i][j]) { case '0': strBin[i] += "0000"; break; case '1': strBin[i] += "0001"; break; case '2': strBin[i] += "0010"; break; case '3': strBin[i] += "0011"; break; case '4': strBin[i] += "0100"; break; case '5': strBin[i] += "0101"; break; case '6': strBin[i] += "0110"; break; case '7': strBin[i] += "0111"; break; case '8': strBin[i] += "1000"; break; case '9': strBin[i] += "1001"; break; case 'A': strBin[i] += "1010"; break; case 'B': strBin[i] += "1011"; break; case 'C': strBin[i] += "1100"; break; case 'D': strBin[i] += "1101"; break; case 'E': strBin[i] += "1110"; break; case 'F': strBin[i] += "1111"; break; default:break; } ++j; } }
for (i = 0; i < n; ++i) { j = strBin[i].size()-1; int con=0; while (strBin[i][j] && j>=0) { if(strBin[i][j]=='1'){ nNum+=pow(2,con); }else{ } --j; con++; } cout<<nNum<<endl; } return 0; }
|
运行结果
FFFACD 16775885
-------------------------------- Process exited after 7.885 seconds with return value 0 请按任意键继续. . .
|
总结
16进制数转10进制数,就按照正常流程,一个16进制数>>4位2进制数,接着从最末尾开始计算权值,累加得10进制数