赞
踩
资源限制
时间限制:1.0s 内存限制:512.0MB
———————————————————————————————————————————
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
———————————————————————————————————————————
样例输入
FFFF
———————————————————————————————————————————
样例输出
65535
十六进制转换成十进制,总体思路就是依次对每一个字符进行处理,加到一起就可以了。问题就在于需要知道每一个字符对应十六进制的哪一位。
这些工作都做完了,细心的朋友会发现,有些样例无法通过,关键就在题目标红的部分,不超过八位十六进制,如果用来存储答案的是int类型的话,输入样例FFFFFFFF,答案是错误的,因为FFFFFFFF对应的十进制数是4294967295大于了int的范围,所以以答案所需要使用的数据类型是长整数类型。
代码如下:
- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- string s;
- cin >> s;
- {
- long long i,c = 1,sum = 0,tmp;
- for(i = 1; s[i] != '\0'; i++)//计算总共有几位十六进制数;
- {
- c *= 16;
- }
- for(int j = 0; s[j] != '\0'; j++)//从最高位开始计算;
- {
- switch(s[j])
- {
- case '0':
- break;
- case '1':
- sum += c;
- break;
- case '2':
- tmp = 2*c;
- sum += tmp;
- break;
- case'3':
- tmp = 3*c;
- sum += tmp;
- break;
- case'4':
- tmp = 4*c;
- sum += tmp;
- break;
- case'5':
- tmp = 5*c;
- sum += tmp;
- break;
- case'6':
- tmp = 6*c;
- sum += tmp;
- break;
- case'7':
- tmp = 7*c;
- sum += tmp;
- break;
- case'8':
- tmp = 8*c;
- sum += tmp;
- break;
- case'9':
- tmp = 9*c;
- sum += tmp;
- break;
- case'A':
- tmp = 10*c;
- sum += tmp;
- break;
- case'B':
- tmp = 11*c;
- sum += tmp;
- break;
- case'C':
- tmp = 12*c;
- sum += tmp;
- break;
- case'D':
- tmp = 13*c;
- sum += tmp;
- break;
- case'E':
- tmp = 14*c;
- sum += tmp;
- break;
- case'F':
- tmp = 15*c;
- sum += tmp;
- break;
- default:
- break;
- }
- c = c/16;//计算完成后,向后移动一位;
- }
- cout << sum << endl;
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。