题目描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。数据范围:保证结果在1≤n≤2的31次方−1。题源
输入描述
输入一个十六进制的数值字符串。
输出描述
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例
输入:0xAA
输出:170
思路
要知道16进制转10进制是怎么转换的:从高位到低位,每个数字乘以16的n-1次方。核心代码就是这个思想。
法1 输入字符串s,计算其长度s.size(),用for循环一个一个字符处理。
法2 输入字符数组s,计算其长度strlen(s),用for循环一个一个字符处理。
具体实现
法1
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin>>s;
int ans=0;
int len = s.size(); //字符串长度
int pos = s.find('x');
for(int i=pos+1; i<len; i++){
ans=ans*16;
if(s[i]>='0' && s[i]<='9') ans+=(s[i]-'0');
else ans+= (s[i]-'A')+10;
}
cout<<ans;
}
法2
#include <bits/stdc++.h>
using namespace std;
int main() {
char s[100];
cin>>s;
int ans=0;
int len = strlen(s); //计算字符数组的长度
for(int i=2; i<len; i++){
ans=ans*16;
if(s[i]>='0' && s[i]<='9') ans+=(s[i]-'0'); //将字符转化为数字-'0'
else ans+= (s[i]-'A')+10; //字符为字母且大于9,A是10,所以-A,再加10,因为是转10进制
}
cout<<ans;
}
(这两个代码还是有区别的,如果直接输入十六进制而不加前边的ox,则法1和法2方法都一样。但是考虑到前边是否会带ox,法1比法2的代码要好,因为对ox的处理更灵活。)
小结
-
无论是用字符串还是字符数组,核心代码都是for循环里的三行。都是对字符串中的单个字符,进行处理,转换。
-
单个字符变数字要-'0'。
-
在算法笔记中有进制转换的核心代码,不懂了及时回顾。